继承、多继承、魔术方法知识点总结

发布时间 2023-08-31 11:02:32作者: 人生努力努力努力就好
一:继承:
继承的意思相当于把父类中可以使用的方法写在自己类中一个性质

例1:创建一个人类,分男人类与女人类
属性:姓名、年龄
方法:吃、走 ====》公共特征
男:方法==》上班
女:方法==》洗衣服
class People:  # 父类,可以理解为一个较为抽象的类,具体细分由下面的子类完成
    # 公共代码放置位置
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def run(self):
        print('%s走路'%self.name)
    def eat(self):
        print('吃东西')

# 继承People类:继承的意思相当于把以上可以使用的方法写在自己的类中一个性质
class man(People):   # 男人类

    def work(self):
        print('%s上班'%self.name)
# 继承People类
class woman(People):
# class woman(man):
    def watch(self):
        print('%s洗衣服'%self.name)

# 实例化
xiaoming=man('小明',20)
xiaoming.run()
xiaoming.work()
#
xiaohua=woman('小花',19)
xiaohua.run()
xiaohua.watch()
# xiaohua.work() # 不能访问小明的方法,子类之间的方法不可以互相访问,除非woman继承man类
# __bases__查看类继承的直接父级(通过类名)
print(woman.__bases__)  # (<class '__main__.man'>,) 继承 
print(man.__bases__)  #  (<class '__main__.A'>,) 继承people  
print(People.__bases__)  # (<class 'object'>,)
# print(xiaohua.__bases__) # 错误写法

运行截图:

 例2:多继承:

重写:当子类继承父类之后,如果子类不想使用父类的方法,可以通过重写来覆盖父类的方法 

class base:
def __init__(self,name,age):
self.name=name
self.age=age

def run(self):
print('%s走路'%self.name)
def eat(self):
print('吃东西')

class Father(base): # 爸爸类
def work(self):
print('%s上班'%self.name)

def cook(self):
print('%s做饭好难吃'%self.name)

class Mother(base): # 妈妈类
def watch(self):
print('%s洗衣服' % self.name)
def cook(self):
print('%s做饭真好吃'%self.name)

# 如果Father在前面先继承Father类,优先级
class Son(Father,Mother):
# 重写:当子类继承父类之后,如果子类不想使用父类的方法,可以通过重写来覆盖父类的方法
def cook(self):

# pass
print('%s做饭最好吃!!!'%self.name)

xiaoming=Son('小明',20)
#
xiaoming.watch()
xiaoming.work()
xiaoming.run()
xiaoming.eat()
xiaoming.cook() # Father在前面先继承
print(Son.__mro__) # 查询类继承的顺序== 调用方法的时候依次查询 object是所有类的父类

运行截图:  

 例3:重写父类方法之后,如果又需要使用父类的方法呢?

super().money() # 如果自己的资金不够就把父类的也拿过来
class base:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def run(self):
        print('%s走路'%self.name)
    def eat(self):
        print('吃东西')

class Father(base):
    def work(self):
        print('%s上班'%self.name)

    def cook(self):
        print('%s做饭好难吃'%self.name)

    def money(self):
        print('爸爸有10万')

class Mother(base): # 多继承
    def watch(self):
        print('%s洗衣服' % self.name)
    def cook(self):
        print('%s做饭真好吃'%self.name)
    def money(self):
        print('妈妈有5万')

class Son(Mother,Father): # 哪个在前面先继承哪个类
    def cook(self): # 重写(新建一个新的类与父类方法名一样的时候),重写就不再使用父类的方法
        # pass
        super().cook() # 在使用的重写的时候再去拿父级的方法,重写了的话就使用自己的
        # super().watch()
        Father.cook(self) # 这样写先继承A类===》可以理解准确性的继承
        print('%s做饭最好吃!!!'%self.name)
    def money(self):
        super().money() # 如果自己的资金不够就把父类的也拿过来
        Father.money(self) # 继承爸爸类
        print('我有一万!!!')

xiaoming=Son('小明',20)

xiaoming.watch()
xiaoming.work()
xiaoming.run()
xiaoming.eat()
xiaoming.cook() # Mother在前面先继承
xiaoming.money()
print(Son.__mro__) # 查询类继承的顺序==  调用方法的时候依次查询

运行截图: