1、派生属性:
当然子类也可以添加自己的新的属性或者在这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性,就以自己为准了。
例1:
class Animal:
def __init__(self, name, aggr, hp):
self.name = name
self.aggr = aggr
self.hp = hp
class Dog(Animal):
def __init__(self, name, aggr, hp, kind):
Animal.__init__(self, name, aggr, hp) # 此处self是狗创建的self
self.kind = kind # 派生属性
def bite(self, person):
person.hp -= self.aggr
class Person(Animal):
def __init__(self, name, aggr, hp, sex, money):
Animal.__init__(self, name, aggr, hp) # 此处self是人创建的self
self.sex = sex # 派生属性
self.money = money
def attack(self, dog):
dog.hp -= self.aggr
dog = Dog('Wangcai', 20, 100, 'teddy')
print(dog.name)
这段代码中,我们在Dog类中增加了kind属性,这个属性是父类中没有的属性,那这个属性就是派生属性。我们增加了Animal.__init__(self.name, aggr, hp)这段代码。我这边就指名道信地调用Animal父类的__init__函数,然后参数包括self都传进来了。Dog就是在原来的基础上增加了派生属性。
2、派生方法:
class Animal:
def __init__(self, name, aggr, hp):
self.name = name
self.aggr = aggr
self.hp = hp
def eat(self):
print('吃药回血')
self.hp += 100
class Dog(Animal):
def __init__(self, name, aggr, hp, kind):
Animal.__init__(self, name, aggr, hp) # 此处self是狗创建的self
self.kind = kind # 派生属性
def bite(self, person):
person.hp -= self.aggr
class Person(Animal):
def __init__(self, name, aggr, hp, sex, money):
Animal.__init__(self, name, aggr, hp) # 此处self是人创建的self
self.sex = sex # 派生属性
self.money = money
def attack(self, dog):
dog.hp -= self.aggr
dog = Dog('Wangcai', 20, 100, 'teddy')
print(dog.hp)
dog.eat()
print(dog.hp)
alex = Person('Alex', 30, 200, 'non', 100)
print(alex.hp)
alex.eat()
print(alex.hp)
父类中没有的属性,在子类中出现,就叫作派生属性。
父类中没有的方法,在子类中出现,就叫作派生方法。
只要是子类的对象调用,子类中有的名字一定用子类的,子类中没有的名字才会去找父类的,如果父类也没有,就报错。
如果父类、子类都有,就用子类的。
如果还想用父类的,就单独调用父类的。
class Animal:
def __init__(self, name, aggr, hp):
self.name = name
self.aggr = aggr
self.hp = hp
def eat(self):
print('吃药回血')
self.hp += 100
class Dog(Animal):
def __init__(self, name, aggr, hp, kind, teeth):
Animal.__init__(self, name, aggr, hp) # 此处self是狗创建的self
self.kind = kind # 派生属性
self.teeth = 0
def eat(self):
Animal.eat(self)
self.teeth += 2
def bite(self, person):
person.hp -= self.aggr
class Person(Animal):
def __init__(self, name, aggr, hp, sex, money):
Animal.__init__(self, name, aggr, hp) # 此处self是人创建的self
self.sex = sex # 派生属性
self.money = money
def attack(self, dog):
dog.hp -= self.aggr
dog = Dog('Wangcai', 20, 100, 'teddy',0)
print(dog.hp)
dog.eat()
print(dog.hp)
print(dog.teeth)
alex = Person('Alex', 30, 200, 'non', 100)
print(alex.hp)
alex.eat()
print(alex.hp)
执行结果:
3、super函数:
在Python3中,子类执行父类的方法也可以直接使用super方法。
class Animal:
def __init__(self, name, aggr, hp):
self.name = name
self.aggr = aggr
self.hp = hp
def eat(self):
print('吃药回血')
self.hp += 100
class Dog(Animal):
def __init__(self, name, aggr, hp, kind, teeth):
super().__init__(name, aggr, hp) # 调用了父类的init函数
self.kind = kind # 派生属性
self.teeth = 0
def eat(self):
Animal.eat(self)
self.teeth += 2
def bite(self, person):
person.hp -= self.aggr
class Person(Animal):
def __init__(self, name, aggr, hp, sex, money):
super().__init__(name, aggr, hp) # 此处self是人创建的self
self.sex = sex # 派生属性
self.money = money
def attack(self, dog):
dog.hp -= self.aggr
dog = Dog('Wangcai', 20, 100, 'teddy',0)
print(dog.hp)
dog.eat()
print(dog.hp)
print(dog.teeth)
alex = Person('Alex', 30, 200, 'non', 100)
print(alex.hp)
alex.eat()
print(alex.hp)
super()就相当于super(Dog, self)。super()就可以找到父类。
super() 只在新式类当中才有,Python3中所有的类都是新式类。
4、在类外也可以执行super()
super(Dog, dog).eat()
说明:如果super在类中使用,不需要传参数。如果super在类的外部使用,必须要给它传递参数。
5、通过继承建立了派生类与基类之间的关系,它是一种“是”的关系。
当类之间有很多相同的功能,提取这些相同的功能做成基类,用继承比较好,比如教授是老师。