面向对象 继承补充和多态

人 狗 有相同属性的同时 还有一些不同的属性

复制代码
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是一对鸭子类型
切片:字符串 列表 元组
+:字符串 列表 数字

原文地址:https://www.cnblogs.com/QQ279366/p/7873758.html