python基础-__init__引入继承、super、继承顺序

_init_引入继承
class Animal:
    def __init__(self,name):
        self.name = name

    def eat(self):
        print('Animal is eating')
        self.breed += 10

class Dog(Animal):
    def __init__(self, name, breed):
        Animal.__init__(self,name)
        self.breed = breed

    def eat(self):
        Animal.eat(self)
        print('dog is eating')

snoopy = Dog('太白',500)
print(snoopy.name,snoopy.breed)
print("----------------")
Animal.eat(snoopy)
print(snoopy.breed)
print("----------------")
snoopy.eat()
print(snoopy.breed)

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/3.继承.py
太白 500
----------------
Animal is eating
510
----------------
Animal is eating
dog is eating
520
派生属性、方法

派生属性 : 在自己的init方法里 使用父类的init方法 —— 指名道姓调用方法
派生方法 : 在子类中增加父类没有的
只要子类有,就有子类的
只要想用父类,Animal.eat(snoopy) 父类名.父类的方法(子类对象) 2.7经典类中

用子类的对象,调用父类的方法:
如果子类中没有这个方法,直接就使用父类的
如果子类中有同名方法:
# 经典类 指名道姓 类名.方法名(子类对象) 类内外一致
# 新式类 super方法 super(子类名,子类对象).方法名() 类内可以省略super的参数

super使用

class Animal:
    def __init__(self,name):
        print(self)
        self.name = name

    def eat(self):
        print("Animal eat")

class Dog(Animal):
    def __init__(self,name,age):
        print(self)
        # super(Dog,self).__init__(name)
        super().__init__(name)
        self.age = age

    def eat(self):
        print("Dog eat")

dog = Dog("dog",1)
print(dog.age,dog.name)

#super外部用
print("------super外部用---------")
super(Dog,dog).eat()
Animal.eat(dog)
dog.eat()

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/python.py
<__main__.Dog object at 0x02D90830>
<__main__.Dog object at 0x02D90830>
1 dog
------super外部用---------
Animal eat
Animal eat
Dog eat
关于同名方法的调用
class Foo:
    def __init__(self):
        self.func()

    def func(self):
        print(self)
        print("foo")

class son(Foo):
    def func(self):
        print(self,"son")
        print("son")
    pass

s = son()

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/python.py
<__main__.son object at 0x039D08B0> son
son

Process finished with exit code 0

我们修改代码如下:

class Foo:
    def __init__(self):
        self.func()

    def func(self):
        print(self)
        print("foo")

class son(Foo):pass
    # def func(self):
    #     print(self,"son")
    #     print("son")


s = son()

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/python.py
<__main__.son object at 0x031F0850>
foo

Process finished with exit code 0
继承顺序

经典类和新式类的多继承问题,继承顺序问题
经典类 : 博大精深 所以经典类就是深度优先
新式类 :广度优先

py3 —— 广度优先
py2 —— 区分经典类、新式类

class D(object):
    pass
    def f(self):
        print('D')

class B(D):
    pass
    def f(self):
        print('B')

class C(D):
    pass
    def f(self):
        print('C')

class A(B,C):
    pass
    def f(self):
        print('A')

a = A()
a.f()
print(A.mro()) #新式类:查看继承顺序

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/4.钻石继承问题.py
A
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>]

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值