本文共 2708 字,大约阅读时间需要 9 分钟。
继承是一种让相似的东西得以自动传递的机制。被继承的类称为基类、父类或超类,而继承者称为子类。子类可以继承父类的属性和方法,但也可以通过重写方法来改变其行为。
类继承的语法非常简单。定义一个新类时,可以在class语句后面指定它的父类:
class Parent: def hello(self): print('调用父类的方法')class Child(Parent): passc = Child()c.hello() # 调用父类的方法 如果子类中定义了与父类同名的方法或属性,会自动覆盖父类的对应方法或属性:
class CChild(Parent): def hello(self): print('重写了父类的方法')d = CChild()d.hello() # 重写了父类的方法 import random as fclass Fish: def __init__(self, name): self.name = name self.x = f.randint(0, 10) self.y = f.randint(0, 10) def move(self): self.x -= 1 print(f'{self.name} 的位置是:{self.x} {self.y}')class Goldfish(Fish): passclass Carp(Fish): passclass Salmon(Fish): passclass Shark(Fish): def __init__(self, name): self.name = name self.hugry = True def eat(self): if self.hugry: print(f'老子是 {self.name}, 老子怕过谁') self.hugry = False else: print(f'算你小子走运,今天 {self.name}我没胃口')fish = Fish('鱼类')fish.move() # 鱼类的位置是:8 9goldfish = Goldfish('金枪鱼')goldfish.move() # 金枪鱼的位置是:6 2shark = Shark('大鲨鱼')shark.eat() # 老子是 大鲨鱼,老子怕过谁shark.eat() # 算你小子走运,今天 大鲨鱼我没胃口 注意到Shark类重写了__init__方法,但没有调用父类的初始化方法,导致x和y属性缺失。正确的做法是使用super().__init__():
class Shark(Fish): def __init__(self, name): super().__init__(name) self.hugry = True def eat(self): if self.hugry: print(f'老子是 {self.name}, 老子怕过谁') self.hugry = False else: print(f'算你小子走运,今天 {self.name}我没胃口')shark = Shark('大白鲨')shark.move() # 大白鲨的位置是:7 3 在子类中,可以直接调用父类的方法。这里的“未被绑定”指的是用子类的实例对象代替父类的实例对象:
class Shark(Fish): def eat(self): if self.hugry: print(f'老子是 {self.name}, 老子怕过谁') self.hugry = False else: print(f'算你小子走运,今天 {self.name}我没胃口')shark = Shark('大白鲨')shark.eat() # 调用了Shark类的eat方法Fish.eat(shark) # 调用了Fish类的eat方法 super() 函数super() 函数不需要明确给出基类的名字,会自动找到所有基类及其对应的方法:
class Shark(Fish): def __init__(self, name): super().__init__(name) self.hugry = True def eat(self): if self.hugry: print(f'老子是 {self.name}, 老子怕过谁') self.hugry = False else: print(f'算你小子走运,今天 {self.name}我没胃口')shark = Shark('大白鲨')shark.move() # 调用了Fish类的move方法 super() 函数的使用使得类继承关系更加灵活,只需修改class语句中的父类即可。
可以使用内建函数 issubclass 来检查一个类是否是另一个类的子类:
issubclass(Goldfish, Fish) # Trueissubclass(Shark, Fish) # Trueissubclass(Bird, Fish) # False
Python支持多重继承,子类可以继承多个基类:
class Base: def method(self): print('Base.method')class Derived(Base1, Base2): passd = Derived()d.method() # 调用Base1和Base2的method方法 子类可以不作任何事情,从超类继承所有的行为。
转载地址:http://exar.baihongyu.com/