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的方法
 

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐