Python面向对象编程(四)
Python面向对象编程知识点1.类 对象2.类属性 对象属性3.类方法 对象方法4.类的封装5.类的单一继承和多重继承二、python类的继承1.继承是面向对象编程的三大特征之一2.python子类继承父类的方法class SubClass(SuperClass1,SuperClass2)pass3.python中的根类是object类所有的类继承来自object类也就是说object类是所有的类的父类。4.类的多重继承的继承顺序很重要#定义一个class类class Item:def info(self):print(fItem重的方法{self.__class__},这是一个商品)class Product:def info(self):print(fProduct方法{self.__class__},这是一个移动产品)class Mouse1(Item,Product):passclass Mouse2(Product,Item):passm1 Mouse1()m1.info()m2 Mouse2()m2.info()寻找info方法是先从自身的类重寻找5.重写父类的方法class Bird:def fly(self):print(我是一只鸟我可以在天空重飞翔...)class Ostrich(Bird):def fly(self):print(我是一只鸟可是我是一直鸵鸟我不能飞翔只能奔跑...)os Ostrich()#实例化对象os.fly()虽然子类继承了父类的方法但是父类的方法给子类已经不合适了所以这个时候就需要重写父类方法了上述案例就是重写父类方法了这个时候调用的就是类对象自己的方法。class Bird:def fly(self):print(我是一只鸟我可以在天空重飞翔...)class Ostrich(Bird):def fly(self):Bird.fly(self) #调用父类的方法print(我是一只鸟可是我是一直鸵鸟我不能飞翔只能奔跑...)os Ostrich()#实例化对象os.fly()6.类继承中关于父类中__init__方法的调用class Employee:def __init__(self,salary):self.salary salarydef work(self):print(f普通员工在写代码工资是{self.salary})class Customer:def __init__(self,favorite,address):self.favorite favoriteself.address addressdef info(self):print(f我是一个顾客我的爱好是:{self.favorite},地址是:{self.address})class Manager1(Employee,Customer):pass #Manager1会优先调用Employee的构造方法__init__class Manager2(Customer,Employee):pass#Manager2会优先调用Customer的构造方法__init__m1 Manager1(12345) #Manager1会优先调用Employee的构造方法__init__m1.work()m2 Manager2(服务器,北京)#Manager2会优先调用Customer的构造方法__init__m2.info()7.类多继承中关于构造函数的方法调用class Employee:def __init__(self,salary):self.salary salarydef work(self):print(f普通员工在写代码工资是{self.salary})class Customer:def __init__(self,favorite,address):self.favorite favoriteself.address addressdef info(self):print(f我是一个顾客我的爱好是:{self.favorite},地址是:{self.address})class Manager1(Employee,Customer):def __init__(self,salary,favorite,address):#通过super函数调用父类的构造方法super().__init__(salary)#通过使用未绑定方法调用父类的构造方法Customer.__init__(self,favorite,address)#pass#pass #Manager1会优先调用Employee的构造方法__init__class Manager2(Customer,Employee):pass#Manager2会优先调用Customer的构造方法__init__m1 Manager1(12345,服务器,北京) #Manager1会优先调用Employee的构造方法__init__m1.work()m1.info()class Employee:def __init__(self,salary):self.salary salarydef work(self):print(f普通员工在写代码工资是{self.salary})class Customer:def __init__(self,favorite,address):self.favorite favoriteself.address addressdef info(self):print(f我是一个顾客我的爱好是:{self.favorite},地址是:{self.address})class Manager1(Employee,Customer):def __init__(self,salary,favorite,address):#通过super函数调用父类的构造方法super(Manager1,self).__init__(salary) ###等价于super().__init__(salary)#super().__init__(salary)#通过使用未绑定方法调用父类的构造方法Customer.__init__(self,favorite,address)#pass#pass #Manager1会优先调用Employee的构造方法__init__class Manager2(Customer,Employee):pass#Manager2会优先调用Customer的构造方法__init__m1 Manager1(12345,服务器,北京) #Manager1会优先调用Employee的构造方法__init__m1.work()m1.info()8.关于super()的说明注意的是super()代表的父类的定义而不是代表父类的对象。class Parent:def __init__(self,name):self.name nameprint(fname初始化:{name})class Child(Parent):def __init__(self,name,age):#Parent.__init__(self,name) #直接调用父类的构造函数#super().__init__(name)#等价于Parent.__init__(self,name)super(Child,self).__init__(name)#等价于super().__init__(name)self.age ageprint(fage初始化:{age})child Child(Alice,25)9.MRO顺序决定方法调用优先级MRO顺序决定了方法调用的优先级并且避免了钻石继承问题确保了每个父类方法只被调用了一次。class BaseA:def method(self):print(BaseA的方法)class BaseB(BaseA):def method(self):print(BaseB的方法)super().method()class BaseC(BaseA):def method(self):print(BaseC的方法)super().method()class MultiChild(BaseB,BaseC):def method(self):print(MultiChild的方法)super().method()#查看方法解析顺序print(MultiChild.__mro__)mc MultiChild()mc.method()(class __main__.MultiChild, class __main__.BaseB, class __main__.BaseC, class __main__.BaseA, class object)MultiChild的方法BaseB的方法BaseC的方法BaseA的方法