面向对象 继承补充和多态
人 狗 有相同属性的同时 还有一些不同的属性
class Animal: def __init__(self,name, aggressivity, life_value): self.name = name self.aggressivity = aggressivity self.life_value = life_value def eat(self): self.life_value += 10 class Dog(Animal): def __init__(self,name,breed,aggressivity,life_value): Animal.__init__(self,name,aggressivity,life_value) self.breed = breed # 派生属性:父类没有的属性 def bite(self,person): # 派生方法:父类没有的方法 person.life_value -= self.aggressivity def eat(self): Animal.eat(self) print('dog is eating') class Person(Animal): def __init__(self,name, aggressivity, life_value,money): Animal.__init__(self, name, aggressivity, life_value) self.money = money def attack(self,dog): dog.life_value -= self.aggressivity snoopy = Dog('太白','京巴',250,500) print(snoopy.life_value) snoopy.eat() print(snoopy.life_value)
派生属性:在自己的init方法里使用父类的init方法——指名道姓调用
派生方法:在子类中增加父类没有的
父类没有 子类有: 子类
子类没有 父类有: 父类
父类有 子类有: 子类
父类有 子类有: 想用父类的 —— Animal.eat(snoopy)
父类有 子类有: 父类子类都想用 —— 在子类中指名道姓的调用父类的方法
只要子类有,就用子类的
只要想用父类,父类名.父类的方法名(子类对象) 2.7经典类中
在新式类中:super()
class Animal: def __init__(self,name, aggressivity, life_value): self.name = name self.aggressivity = aggressivity self.life_value = life_value def eat(self): self.life_value += 10 class Dog(Animal): def __init__(self,name,breed,aggressivity,life_value): # Animal.__init__(self,name,aggressivity,life_value) # super(Dog,self).__init__(name, aggressivity, life_value) super().__init__(name, aggressivity, life_value) # 新式类 self.breed = breed # 派生属性:父类没有的属性 def bite(self,person): # 派生方法:父类没有的方法 person.life_value -= self.aggressivity def eat(self): # Animal.eat(self) super().eat() print('dog is eating') class Person(Animal): def __init__(self,name, aggressivity, life_value,money): # Animal.__init__(self, name, aggressivity, life_value) super().__init__(name, aggressivity, life_value) self.money = money def attack(self,dog): dog.life_value -= self.aggressivity snoopy = Dog('太白','京巴',250,500) super(Dog,snoopy).eat()
用子类的对象调用父类的方法:
如果子类中没有这个方法,直接就使用父类的
如果子类中有同名方法:
经典类 指名道姓 类名.方法名(子类对象) 类内外一致
新式类 super方法 super(子类名,子类对象).方法名() 类内可以省略super的参数
class Foo: def __init__(self): self.func() def func(self): print('Foo.func') class Son(Foo): def func(self): print('Son.func') s = Son() # Son.func
经典类和新式类的多继承问题,继承顺序问题
# python2中 class A:pass # 经典类 class A(object):pass # 新式类
经典类:深度优先
新式类:广度优先
print(A.mro()) # 查看继承顺序 新式类才有
多态
class Person: def attack(self): pass class Dog: def attack(self): pass def attack(obj): # 多态 obj.attack() d = Dog() p = Person() attack(d) # d.attack() attack(p) # p.attack()
鸭子类型
list tuple是一对鸭子类型
切片:字符串 列表 元组
+:字符串 列表 数字