继承
继承是面向对象的三大特性之一,通过继承可以获得其他类的属性或者方法。
class Animal:
def run(self):
print('动物跑起来了')
def sleep(self):
print('动物睡觉')
a = Animal()
class dog(Animal):
print('狗看家')
d = dog()
d.run()#继承了Animal的属性
d.sleep()#继承了Animal的属性
r = isinstance(d,Animal)#检查一个类是否是另一个类的子类
print(r)
'''
狗看家
动物跑起来了
动物睡觉
True
'''
object是所有类的父类
方法的重写(override)
如果在子类中有和父类同名的方法,则通过子类实例去调用方法,会调用子类的方法而不是父类的方法,这个特点就是方法的重写。
class a(object):
def test(self):
print('a')
class b(a):
def test(self):
print('b')
class c(b):
def test(self):
print('c')
d = c()
d.test()
'''
c
'''
调用顺序:d.test()先从类c中去寻找test方法,如果没有再向c的父类中去找
当我们调用一个对象的方法时:
1、会优先去当前对象中寻找是否具有该方法,如果有则直接调用
2、如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法
3、如果没有,则去父类中的父类寻找,以此类推,直到找到object,如果依然没有则报错
super用法
父类中所有的方法都会被子类继承,包括特殊的方法
class Animal:
def __init__(self,name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
def run(self):
print('动物跑起来了')
def sleep(self):
print('动物睡觉')
class dog(Animal):
def run(self):
print('狗在跑')
d = dog()
'''
TypeError: __init__() missing 1 required positional argument: 'name'
'''
代码一:
class Animal:
def __init__(self,name,sex):
self._name = name
self._sex = sex
#*********sex**************
@property
def sex(self):
return self._sex
@sex.setter
def sex(self,sex):
self._sex = sex
#**********name*************
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
#************************
def run(self):
print('动物跑起来了')
def sleep(self):
print('动物睡觉')
class dog(Animal):
def __init__(self,name,age,sex):
self._name = name
self._age = age
self._sex = sex
#*******age***************
@property
def age(self):
return self._age
@age.setter
def age(self, age):
self._age = age
def run(self):
print('狗在跑')
d = dog('阿黄','%d岁'%7,'公')
print(d.name)
print(d.age)
print(d.sex)
'''
阿黄
7岁
公
'''
代码二:
class Animal:
def __init__(self,name,sex):
self._name = name
self._sex = sex
#*********sex**************
@property
def sex(self):
return self._sex
@sex.setter
def sex(self,sex):
self._sex = sex
#**********name*************
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
#************************
def run(self):
print('动物跑起来了')
def sleep(self):
print('动物睡觉')
class dog(Animal):
def __init__(self,name,age,sex):
# self._name = name#变化
self._age = age
# self._sex = sex#变化
Animal.__init__(self,name,sex)#变化,上面2行代码变成一行
#*******age***************
@property
def age(self):
return self._age
@age.setter
def age(self, age):
self._age = age
def run(self):
print('狗在跑')
d = dog('阿黄','%d岁'%7,'公')
print(d.name)
print(d.age)
print(d.sex)
代码三:
class Animal:
def __init__(self,name,sex):
self._name = name
self._sex = sex
#*********sex**************
@property
def sex(self):
return self._sex
@sex.setter
def sex(self,sex):
self._sex = sex
#**********name*************
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
#************************
def run(self):
print('动物跑起来了')
def sleep(self):
print('动物睡觉')
class dog(Animal):
def __init__(self,name,age,sex):
# self._name = name
self._age = age
# self._sex = sex
# Animal.__init__(self,name,sex)#变化地方
super().__init__(name,sex)
#*******age***************
@property
def age(self):
return self._age
@age.setter
def age(self, age):
self._age = age
def run(self):
print('狗在跑')
d = dog('阿黄','%d岁'%7,'公')
print(d.name)
print(d.age)
print(d.sex)
多重继承
在python中是支持多重继承的,也就是可以为一个类同时制定多个父类
可以在类名的()后边添加多个类,来实现多重继承
多重继承会使子类同时拥有多个父类,并且会获取到所有父类的方法
注意:在开发中没有特殊情况,应该尽量避免使用多重继承,因为多重继承会让代码更加复杂
多重继承调用方法:会在第一个父类中寻找,然后再找第二个父类…前面的会覆盖后面的
语法:类名.bases
class a(object):
def test(self):
print('a')
class b(object):
def test(self):
print('b')
class c(a,b):
def test(self):
print('c')
print(c.__bases__)
'''
(<class '__main__.a'>, <class '__main__.b'>)
'''
class a(object):
def test(self):
print('a')
class b(object):
def test(self):
print('b')
class c(a,b):
pass
# print(c.__bases__)
c = c()
c.test()#先去父类a中寻找test方法,如果没有再去b中寻找。。。。。。。
'''
a
'''