zoukankan      html  css  js  c++  java
  • 多继承续篇与多态

    回顾:

    多继承:可以继承多个父类

          优点:子类可以同时遗传多个父类的属性,最大限度地重用代码
          缺点:
            1、违背人的思维习惯:继承表达的是一种什么"是"什么的关系
            2、代码可读性会变差
            3、不建议使用多继承,有可能会引发可恶的菱形问题,扩展性变差,
              如果真的涉及到一个子类不可避免地要重用多个父类的属性,应该使用Mixins

    多继承的正确打开方式:mixins机制
    mixins机制核心:就是在多继承背景下尽可能地提升多继承的可读性
    ps:让多继承满足人的思维习惯表达什么"是"什么(补充:通常Mixin结果的类放在左边)

    class Vehicle:
        pass
    
    class FlyableMixin:
        def fly(self):
            pass
    
    class CivilAircraft(FlyableMixin,Vehicle):  # 民航飞机
        pass
    
    class Helicopter(FlyableMixin,Vehicle):  # 直升飞机
        pass
    
    class Car(Vehicle):  # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
        pass

    在子类派生的新方法中如何重用父类的功能
    方式一:指名道姓调用某一个类下的函数 不依赖于继承关系

    class OldboyPeople:
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    
        def f1(self):
            print('%s say hello' %self.name)
    
    
    class Teacher(OldboyPeople):
        def __init__(self,name,age,sex,level,salary):
            OldboyPeople.__init__(self,name,age,sex)
    
            self.level = level
            self.salary=salary
    
    tea_obj=Teacher('egon',18,'male',10,3000)
    print(tea_obj.__dict__)

    方式二:super()调用父类提供给自己的方法=》严格依赖继承关系
    调用super()会得到一个特殊的对象,该对象会参照发起属性查找的那个类的mro,去当前类的父类中找属性

    class A:
        def test(self):
            print('from A')
            super().test()
    
    class B:
        def test(self):
            print('from B')
    
    class C(A,B):
        pass
    
    
    obj=C()
    obj.test()
    
    print(C.mro())

    1、什么多态:同一事物有多种形态

    class Animal:
        pass
    
    class People(Animal):
        pass
    
    class Dog(Animal):
        pass
    
    class Pig(Animal):
        pass

    2、为何要有多态=》多态会带来什么样的特性,多态性
    多态性指的是可以在不考虑对象具体类型的情况下而直接使用对象

    class Animal: # 统一所有子类的方法
        def say(self):
            print('动物基本的发声频率。。。',end=' ')
    
    class People(Animal):
        def say(self):
            super().say()
            print('嘤嘤嘤嘤嘤嘤嘤')
    
    class Dog(Animal):
        def say(self):
            super().say()
            print('汪汪汪')
    
    class Pig(Animal):
        def say(self):
            super().say()
            print('哼哼哼')
    
    
    obj1=People()
    obj2=Dog()
    obj3=Pig()
    
    
    obj1.say()
    obj2.say()
    obj3.say()

    python推崇的是鸭子类型

    class Cpu:
        def read(self):
            print('cpu read')
    
        def write(self):
            print('cpu write')
    
    class Mem:
        def read(self):
            print('mem read')
    
        def write(self):
            print('mem write')
    
    
    class Txt:
        def read(self):
            print('txt read')
    
        def write(self):
            print('txt write')
    
    
    obj1=Cpu()
    obj2=Mem()
    obj3=Txt()
    
    obj1.read()
    obj1.write()
    
    obj2.read()
    obj2.write()
    
    obj3.read()
    obj3.write()

    补充的内置函数

    # zip
    v1 = 'hello'
    v2 = [111, 222, 333, 444, 5555, 6666]
    res = zip(v1, v2)
    print(list(res))
    
    # divmod
    print(divmod(10000, 33))
    
    
    # (303, 1)
    
    # dir
    class Foo:
        pass
    
    
    obj = Foo()
    obj.xxx = 1111
    print(dir(obj))  # obj.哪些属性
    
    # enumerate
    for i, v in enumerate(['a', 'b', 'c']):
        print(i, v)
    
    # eval
    res = eval('{"a":1}')  # 执行字符串中的表达式
    print(res, type(res))
    
    
    # isinstance
    class Foo:
        pass
    
    
    obj = Foo()
    print(isinstance(obj, Foo))
    print(isinstance([], list))  # 类型判断推荐使用isinstance
    print(type([]) is list)  # 不推荐使用
    
    # __import__
    time = __import__('time')
    time.sleep(3)
  • 相关阅读:
    Google Map API基本概念(转载)很好的例子
    Sql Exception Handling & Throw Exception
    幸福人生讲座(十):五伦中哪一伦最重要?
    Delete Database Log
    杨澜语录
    余世雄 如何提升职场“执行力”
    红楼女梦
    假如我真的看透了
    余世维 有效沟通
    习惯修养
  • 原文地址:https://www.cnblogs.com/zhenghuiwen/p/12673336.html
Copyright © 2011-2022 走看看