面向对象的三大特性
封装,继承,多态
继承:可以有效的节省代码
python中类分为两种:
新式类,经典类。
python3x 中所有的类都默认继承object类,继承object类的类称为新式类。
Python2 中默认是经典类,如果改成新式类,就让类(object) 继承object类
新式类 :遵循的广度优先。
经典类 :遵循的深度优先。
通过mro(类名)方法可以查看到类的继承循序
继承的问题:
classAnimal:
soup= '灵魂'
def __init__(self,varieties, sex, color):
self.varieties=varieties
self.sex=sex
self.color=colordefeat(self):print('吃')classCat(Animal):
a=Animal.eatdefeat(self):print('猫吃饭')classBird(Animal):def __init__(self,varieties, sex, color,fly):#Animal.__init__(self,varieties, sex, color,) # 执行父类的方法第一种方式
#super(Animal,self).__init__(varieties, sex, color,) # 执行父类的方法第二种方式
super().__init__(varieties, sex, color,) #执行父类的方法第二种方式 省略写法 super方法可以不用去关心父类具体名字。
self.fly = fly #个性化的封装
defeat(self):
super().eat()print('鸟该吃饭了....')
cat1= Cat('波斯猫', '公', '橘黄')
cat1.eat()#问题一:#执行顺序,所以执行 猫吃饭.
#问题二:#猫,鸟,都有自己独立属性,如何使用共同的属性并且使用独立的属性。
b1 = Bird('鹦鹉','公', '绿色',800)#print(b1.__dict__)
b1.eat()
在多继承当中,新式类中采用的是mro算法
我们可以使用print(类名.__mro__)方法查看到该类的继承顺序。
接口类、抽象类
定义一个基类,把基类中的方法定义成接口函数,可以限制继承他的子类必须实现这个方法,即所有的子类都必须兼容父类的方法。
importabcclass All_file(metaclass=abc.ABCMeta):
@abc.abstractmethod#实现接口函数的装饰器
def read(self): #接口函数本身不用具体的实现,而是有继承他的子类自己去实现
pass@abc.abstractmethoddefwrite(self):pass
classDisk(All_file):defread(self):print('disk read')defwrite(self):print('disk write')classCdrom(All_file):defread(self):print('cdrom read')defwrite(self):print('cdrom write')classMem(All_file):defread(self):print('mem read')defwrite(self):print('mem write')m1=Mem()
m1.read()
m1.write()
封装:
广义封装:封装到对象中的属性是一种封装。 类本身就算是一种封装
classPerson:
country= 'China'
def __init__(self,name,age):
self.name=name
self.age=agedeffunc(self):print(self.name)
p1= Person('alex',1000)
p2= Person('wusir',10000)
p1.func()
狭义分装:私有性封装,在类内部,通过 _ _ 开头定义的方法或静态变量,都称之为私有的
私有:私有静态字段(私有静态变量),私有普通字段(私有对象属性),私有方法。
私有静态字段(私有静态变量)classPerson:
country= 'China' #公有静态字段(公有静态变量)
__name = 'oldboy' #私有静态字段(私有静态变量)
__age = 1000 #私有静态字段(私有静态变量)
deffunc1(self):return self.__name
print(Person.country)
#在类的外部不能调用print(Person.__name)
p1= Person()
print(p1.__name)
print(Person.__dict__['_Person__name'])
print(Person._Person__name) #只要类执行,将类的内容加载到内存时,发现有 __变量名这样的静态变量或方法,Python解释器自动将__变量名
#私有化后的静态变量或方法,类内部可以访问,父类以及类的外部不能访问。