面向对象 继承补充和多态
人 狗 有相同属性的同时 还有一些不同的属性
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是一对鸭子类型
切片:字符串 列表 元组
+:字符串 列表 数字


浙公网安备 33010602011771号