Python学习 - 语法入门:https://blog.csdn.net/wanzijy/article/details/125287855
Python学习 - 数据类型:https://blog.csdn.net/wanzijy/article/details/125341568
Python学习 - 流程控制:https://blog.csdn.net/wanzijy/article/details/125400906
Python学习 - 运算符(操作符):https://blog.csdn.net/wanzijy/article/details/125387919
Python学习 - 列表:https://blog.csdn.net/wanzijy/article/details/125457990
Python学习 - 字典:https://blog.csdn.net/wanzijy/article/details/125567225
Python学习 -元组和集合:https://blog.csdn.net/wanzijy/article/details/125577609
Python学习 - 函数(1):https://blog.csdn.net/wanzijy/article/details/125669084
Python学习 - 函数(2):https://blog.csdn.net/wanzijy/article/details/125739981
Python学习 - 类与对象:https://blog.csdn.net/wanzijy/article/details/125826952
Python学习 - 面向对象之封装:https://blog.csdn.net/wanzijy/article/details/125902925
Python学习 - 面向对象之继承:https://blog.csdn.net/wanzijy/article/details/125963829
Python学习 - 面向对象之多态:https://blog.csdn.net/wanzijy/article/details/127140632
Python - 文件操作(1):https://blog.csdn.net/wanzijy/article/details/127099071
Python - 文件操作(2):https://blog.csdn.net/wanzijy/article/details/127150189
Python学习 - 垃圾回收、特殊方法和模块:https://blog.csdn.net/wanzijy/article/details/126202999
Python学习 - 异常处理:https://blog.csdn.net/wanzijy/article/details/126803672
1. 简介
通过继承可以使一个类获取到其他类中的属性和方法
在定义类时,可以在类名后的括号中指定当前类的父类(超类、基类、super)
子类(衍生类)可以直接继承父类中的所有属性和方法
通过继承可以直接让子类获取到父类的方法或属性,避免编写重复性的代码,并且也符合OCP原则,所以经常使用继承来对一个类进行扩展
如果在创建类时,省略了父类,则默认父类是Object
所有的类都继承自Object
issubclass(C, B) 检查C是不是B的子类;是的话返回True,反之
class Animal():
def run(self):
print('动物会跑~~~')
def sleep(self):
print('动物睡觉~~~')
class Dog(Animal):
def bark(self):
print('汪汪汪~~~')
class Hashiqi(Dog):
def hashiqiBark(self):
print('哈士奇汪汪汪~~~')
d = Dog()
d.run()
print(isinstance(d, Animal)) # True
print(isinstance(d, Dog)) # True
ha = Hashiqi()
ha.hashiqiBark()
ha.run()
print(issubclass(Animal, object)) # True
2. 方法重写
如果在子类中有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点就叫做方法的重写
当我们调用一个对象的方法时,会优先去当前对象中寻找是否具有该方法,如果有则直接调用。如果没有,则取当前对象的父类中寻找。如果还是没有就继续往上找,直到找到 Object,还是没有找到的话就会报错
class A():
def test(self):
print('我是A')
class B(A):
pass
class C(B):
pass
c = C()
c.test() # 我是A
3. super()
父类中所有方法都会被子类继承,包括特殊方法
如果想直接调用父类的 “ _init_ ” 来初始化父类中定义的属性,可以使用下面的方法
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
class Dog(Animal):
def __init__(self, name, age):
# 这里是使用对象来直接调用方法,所以要传self参数;如果是使用对象的实例来调用方法,则不用传self参数
Animal.__init__(self, name)
self._age = age
@property
def age(self):
return self._age
@age.setter
def age(self, age):
self._age = age
d = Dog('旺财', 18)
print(d.name)
print(d.age)
但是像上面的方法,导致父类直接写死在代码中,提高了代码的耦合度
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
class Dog(Animal):
def __init__(self, name, age):
super().__init__(name) # 通过super()返回对象对象调用父类方法时,不需要传递self参数
self._age = age
@property
def age(self):
return self._age
@age.setter
def age(self, age):
self._age = age
d = Dog('旺财', 18)
print(d.name)
print(d.age)
4. 多重继承
_bases_ 属性
- 可以用来获取当前类的所有父类
- 返回的是一个元组
class A():
def test(self):
print('我是A')
class B(A):
pass
class C(B):
pass
print(C.__bases__) # (<class '__main__.B'>,)
在 Python 中是支持多重继承的,也就是我们可以为一个类同时指定多个父类
可以在类名的 () 后边可以添加多个类,来实现多重继承
多重继承会使子类同时拥有多个父类,并且会获取到所有父类中的方法
不过应该要避免使用多重继承,因为多重继承会让代码过于复杂
如果多个父类中有同名的方法,则会先在第一个父类中寻找,然后找第二个,以此类推。其实就是前面父类的方法覆盖后面父类的方法
class D():
def test(self):
print('D的test()')
class E():
def test(self):
print('E的test()')
class F(D, E):
pass
print(F.__bases__) # (<class '__main__.D'>, <class '__main__.E'>)
f = F()
f.test() # D的test()