• 面向对象 继承补充和多态


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

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

  • 相关阅读:
    Redis 如何设置密码及验证密码?
    怎么测试 Redis 的连通性?
    Redis 的内存用完了会发生什么?
    假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以 某个固定的已知的前缀开头的,如果将它们全部找出来?
    使用过 Redis 做异步队列么,你是怎么用的?
    简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 ?
    你怎么看到为表格定义的所有索引?
    深入理解卷积网络的卷积
    OpenCV-Python 图像阈值 | 十五
    OpenCV-Python 图像的几何变换 | 十四
  • 原文地址:https://www.cnblogs.com/QQ279366/p/7873758.html
Copyright © 2020-2023  润新知