继承
- 类的继承, issubclass( ) 方法
- 方法的重写 , super( ) 方法
- 多重继承 , 类名.__bases__ 方法
Tips:没有必要的话,多重继承尽量避免使用
class Animal :
def run( self ) :
print('动物会跑。')
def sleep( self ) :
print('动物睡觉。')
# 当前有一个类,能实现大部分功能,但实现不了全部功能
# 创建一个新类让它继承这个类的属性和方法
# 在定义类时,可以在括号内指定当前类的父类(又叫超类,基类,super)
# 子类(衍生类)可以直接继承父类的属性和方法
# 通过继承可以避免重复编写代码,并且也符合OCP原则
# 所以我们经常通过继承对一个类进行扩展
class Dog(Animal) :
def brak( self ) :
print('狗叫。')
# def run(self) :
# print('bdog')
d = Dog()
d.run()
r = isinstance(d,Dog)
print(r)
r = isinstance(d,Animal)
print(r)
class Hashiqi(Dog):
def sha(self) :
print('我是哈士奇。')
print()
# 创建一个类时,如果省略了父类,则默认父类是object
# object是所有类的父类,所有类都继承自object
# issubclass(C,B) 检查C类是不是B类的子类
# isinstance(B,A) 检查对象B是不是A类的实例,如果A是其类的父类也会返回True
print( issubclass(Dog,Animal) )
print( issubclass(Hashiqi,Animal) )
print( issubclass(Animal,object) )
print( isinstance( d,Animal) )
方法重写和super( ):
# 如果在子类中有和父类同名的方法,则在调用时会调用子类中的方法
# 这就是方法的重写(覆盖,override)
# 在调用方法时,会优先在当前类中去寻找,有则调用,
# 没有就去它的父类中寻找,有则调用,没有就再去它的父类中寻找,
# 以此类推,直到找到object类,如果没有就报错
class Animal :
def run( self ) :
print('动物会跑。')
def sleep( self ) :
print('动物睡觉。')
class Dog(Animal) :
def brak( self ) :
print('狗叫。')
def run(self) :
print('dog 跑。')
d = Dog()
d.run()
print(' -'*30)
# super( )
class Animal :
def __init__ (self,name):
self._name = name
def run( self ) :
print('动物会跑。')
def sleep( self ) :
print('动物睡觉。')
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
class Dog(Animal) :
def __init__(self,name,age):
# super( ) 可以用来获取当前类的父类,
# 并且通过super( ) 调用父类的方法是,不需要传递self
super().__init__(name)
self._age = age
def brak( self ) :
print('狗叫。')
@property
def age(self):
return self._age
@age.setter
def age(self,age):
self._age = age
d = Dog('小黑',3)
d.age = 4
print( d.name,d.age )
多重继承:
# Python中支持多重继承,即一个类可以有多个父类
# 多重继承会使子类同时拥有多个父类的方法
# 在开发时没有特殊情况,尽量避免使用多重继承,多重继承会使代码更复杂
# 如果多个父类中由同名方法,会从前向后查找,找到即调用
# 所以前面的父类的优先级高
class A(object):
def test1(self):
print('AAA')
class B(object):
def test1(self):
print('B中的test1')
def test2(self):
print('BBB')
class C(A,B):
def test3(self):
print('CCC')
print(C.__bases__)# (<class '__main__.A'>, <class '__main__.B'>)
print(C.__base__)# <class '__main__.A'>
# 类名.__bases__ 可以用来获得当前类的所有父类
# 类名.__base__ 可以用来获得当前类的的第一个父类
c = C( )
c.test1()# 调用了A父类的test1方法,而没有调用B父类的test1方法