zoukankan      html  css  js  c++  java
  • 面向对象 继承补充和多态

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

    复制代码
    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
Copyright © 2011-2022 走看看