由_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