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

来源:互联网 发布:java utf-8转gbk乱码 编辑:程序博客网 时间:2024/06/17 02:00

        • 由_init_引入继承
        • 派生属性方法
        • super使用
        • 关于同名方法的调用
        • 继承顺序

_init_引入继承

class Animal:    def __init__(self,name):        self.name = name    def eat(self):        print('Animal is eating')        self.breed += 10class 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 eating510----------------Animal is eatingdog is eating520

派生属性、方法

派生属性 : 在自己的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 eatAnimal eatDog 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")    passs = son()

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/python.py<__main__.son object at 0x039D08B0> sonsonProcess 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>fooProcess 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.钻石继承问题.pyA[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>]Process finished with exit code 0
原创粉丝点击