一、什么是面向过程
面向过程是按照步骤进行的
有明确的步骤
案例:把大象装进大的冰箱里
把冰箱的门打开
把大象拉到冰箱门口
把大象推进冰箱里面
把冰箱门关起来
二、什么是面向对象
面向对象是基于对象本身的
没有固定步骤,只有相应的行为和属性
案例:把大象装进冰箱
有两个对象:大象和冰箱
大象的行为:走路,吃东西,睡觉
大象的属性:耳朵大,四条腿,鼻子长,体重高
冰箱的行为:开门,关门,冰冻,装东西
冰箱的属性:立方体的、黑色、品牌、型号
通过调用装东西的这个行为,就可以把大象装进冰箱
三、类和实例
类就是分类,表明对象是属于哪个分类的,该分类有什么行为和属性,也就是区别于其他的类的东西
实例就是某个类下具体的某样东西。比如:大象叫什么名字,多重,吃多少东西,几岁了。实例就是区别与别的东西,类的命名首字母建议大写
__main__.Elephant object at 0x00314790
命名空间 类名 内存地址
class Element:
name = "Andy"
weight = 1000
height = 4
def walk(self):# self是代表对象本身
print('{} is walking'.format())
class Icebox:
name = "haier"
box = []
def push(self,something):
self.box.append(something)
print("把{}加入了冰箱!".format(something))
daxiang = Element()
bingxiang = Icebox()
print(bingxiang.box)
bingxiang.push(daxiang)
bingxiang.box[0].walk()
# 本案例输出结果
# 把<__main__.element object at>加入了冰箱!
# Andy is walking
四、类属性和实例属性、实例方法
直接在类下面写的属性(变量)就是类属性
类属性是所有的类实例对象都共享的
类属性只能通过类名来修改
实例对象可以调用类属性
类名可以调用类属性
实例属性是每个实例独有的,修改实例属性本身并不会影响到其他实例对象
实例属性是在__init__函数里面声明(定义)的
实例属性在实例化的时候需要制定
实例化时会最先执行__init__函数,如果有参数,那么需要传入指定的参数
类名不能调用实例属性
实例对象可以调用实例方法(行为)
类名如果要调用实例方法的时候,需要传入具体的实例对象
实例方法的第一个参数表示实例对象本身
class Element():
def __init__(self, namer, age):
= namer
self.age = age
print("我是一只大象,没有调用属性和方法之前,我是先执行的")
xiang = Element("小白",18)
print()
# 输出结果:我是一只大象,没有调用属性和方法之前,我是先执行的 小白
# 实例化时会最先执行__init__函数
五、类方法
类方法的第一个参数名称是cls,代表的是类本身
类方法的声明需要使用装饰器@classmethod
类名可以调用类方法
实例对象也可以调用类方法
六、静态方法
当一个函数,即用不到类的属性和方法,也用不到实例的属性和方法的时候,但是又想把它放在类里面方便管理,这时候就需要用到静态方法
静态方法使用@staticmethod 进行修饰,表明该方法是静态方法
静态方法里面是不能引用实例属性、实例方法,但是可以通过类名类调用类属性和类方法(但是不建议)
实例对象和类名都可以调用静态方法
# -*- coding: utf-8 -*-
class Element:
name = "Andy"
weight = 1000
height = 4
def walk(self):# self是代表对象本身
print('{} is walking'.format())
@staticmethod
def sleep(ceshi):
print('{}静态方法的使用'.format(ceshi))
i = Element()
i.sleep("x")
# 上述通过添加@staticmethod,用到了静态方法进行修饰,使ceshi不再是跟self等同的作用,而是可以作为自由的变量
# 上述如果不添加@staticmethod,输出结果会报错:TypeError: sleep() takes 1 positional argument but 2 were given
# 添加后输出结果为:x静态方法的使用
七、魔术方法
魔术方法是python类内置的一些方法名称,以双下划线开头和结尾的
面向对象的三大特征:封装、继承、多态
class A:
def __init__(self):
print('实例化时我是最先执行的')
def __del__(self): # 析构函数
print('对象死之前会调用我')
def foo():
a = A()
print('函数执行中....')
foo()
# 输出结果为
# 实例化时我是最先执行的
# 函数执行中....
# 对象死之前会调用我
class MyAdd:
def __init__(self, x):
self.x = x
def __add__(self, other):
if isinstance(other, MyAdd):
return self.x + other.x
raise TypeError('not support type')
a = MyAdd(10)
b = MyAdd(20)
c = a + b
print(c)
# 以上是面向对象多态的一种表现,使其具有相加的方法,最终输出结果为30
八、类的继承(单继承)
子类可以继承父类,通过类名()里面放入父类的名称就可以了
子类可以继承父类的属性和方法
如果子类要添加自己实例属性的时候,需要重写__init__函数,并调用父类的__init__函数
子类可以添加自己的方法
子类也可以重写父类的方法
在python3中所有类的基类是object
也就是说所有的类都是直接或间接的继承object
class Mouse:
def __init__(self,name,skin,age):
= name
self.skin = skin
self.age = age
class Whitemouse(Mouse):
def __init__(self,name,skin,age,leg):
Mouse.__init__(self,name,skin,age)
self.leg = leg
# 以上是子类继承父类方法属性的方式之一,也可以用下面的super方法
def __init__(self,name,skin,age,leg):
# Mouse.__init__(self,name,skin,age)
super(Whitemouse, self).__init__(self,name,skin,age)
九、类的继承(多重继承)
要想获取所有父类的属性,那么需要显式的在__init__方法中调用父类的__init_方法
假如多个父类的方法重名,默认使用的是第一个父类的方法,要想指明使用哪个父类的
方法的时候,需要重写该方法,然后重写的方法里面调用指定父类的方法
# 多重继承的时候,需要显式的调用父类的构造函数
# 否则默认只继承第一个父类的属性
十、类的成员私有化
属性私有化
方法私有化
完全私有化,在属性或方法名称前面用双下划线(__)
完全私有化的属性和方法只能在类的内部访问,实例对象不能访问也不能获取
部分私有化(property)保护属性
保护属性 属性和方法名称前面是一个下划线(_), 实例对象可以方法