Python面向对象编程(四)
Python面向对象编程知识点
1.类 & 对象
2.类属性 & 对象属性
3.类方法 & 对象方法
4.类的封装
5.类的单一继承和多重继承
二、python类的继承
1.继承是面向对象编程的三大特征之一
2.python子类继承父类的方法
class SubClass(SuperClass1,SuperClass2)
pass
3.python中的根类是object类,所有的类继承来自object类,
也就是说object类是所有的类的父类。
4.类的多重继承的继承顺序很重要
#定义一个class类
class Item:
def info(self):
print(f"Item重的方法:{self.__class__}","这是一个商品")
class Product:
def info(self):
print(f"Product方法:{self.__class__}","这是一个移动产品")
class Mouse1(Item,Product):
pass
class Mouse2(Product,Item):
pass
m1 = 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 = salary
def work(self):
print(f"普通员工在写代码,工资是{self.salary}")
class Customer:
def __init__(self,favorite,address):
self.favorite = favorite
self.address = address
def 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 = salary
def work(self):
print(f"普通员工在写代码,工资是{self.salary}")
class Customer:
def __init__(self,favorite,address):
self.favorite = favorite
self.address = address
def 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 = salary
def work(self):
print(f"普通员工在写代码,工资是{self.salary}")
class Customer:
def __init__(self,favorite,address):
self.favorite = favorite
self.address = address
def 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 = name
print(f"name初始化:{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 = age
print(f"age初始化:{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的方法
更多推荐



所有评论(0)