多继承续篇与多态

Posted zhenghuiwen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多继承续篇与多态相关的知识,希望对你有一定的参考价值。

回顾:

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

      优点:子类可以同时遗传多个父类的属性,最大限度地重用代码
      缺点:
        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)

以上是关于多继承续篇与多态的主要内容,如果未能解决你的问题,请参考以下文章

继承与多态

java中封装,继承,多态,接口学习总结

Java语言基础28-29--接口与多态

java 代码片段

C++多态

Python_12 多继承与多态