mezcla y derivación

Primero, mixin

La forma correcta de abrir la herencia múltiple: mecanismo de mixins

El núcleo del mecanismo mixins: es mejorar la legibilidad de la herencia múltiple tanto como sea posible en el contexto de la herencia múltiple

ps: dejar que la herencia múltiple satisfaga los hábitos de pensamiento de las personas = "qué" es "qué"

class Vehicle:
    pass

class FlyableMixin:
    def fly(self):
        pass

class CivilAircraft(FlyableMixin,Vehicle):  # 民航飞机
    pass

class Helicopter(FlyableMixin,Vehicle):  # 直升飞机
    pass

class Car(Vehicle):  # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
    pass

Tenga mucho cuidado al usar la clase Mixin para implementar herencia múltiple

  • En primer lugar, debe representar una determinada función, no un elemento. Python generalmente nombra la clase mixin con el sufijo Mixin, able, ible
  • En segundo lugar, debe tener una responsabilidad única. Si hay múltiples funciones, escriba múltiples clases de Mixin. Una clase puede heredar múltiples Mixin. Para garantizar que se siga el principio de herencia "es-un", solo se puede heredar un padre que identifique su significado de pertenencia. Clase
  • Entonces, no depende de la implementación de la subclase
  • Finalmente, incluso si la subclase no hereda la clase Mixin, todavía funciona, pero carece de cierta función. (Por ejemplo, el avión aún puede transportar pasajeros, pero no puede volar)

2. Derivación

派生:子类中衍生出的新东西
    1、子类独有,父类没有
    2、子类有,父类也有,子类是完全覆盖父类的
    3、子类有,父类也有,子类是在父类的基础上进行拓展

Cómo reutilizar las funciones de la clase primaria en el nuevo método derivado de la clase secundaria

Método 1: el apellido llamado llama a una función bajo una determinada categoría = "no depende de la herencia

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__)
{'name': 'egon', 'age': 18, 'sex': 'male', 'level': 10, 'salary': 3000}

Método 2: super () llama a sí mismo el método proporcionado por la clase padre = "depende estrictamente de la relación de herencia

Llame a super () obtendrá un objeto especial, el objeto se referirá al mro de la clase que inició la búsqueda de atributos, vaya a la clase padre de la clase actual

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):
        # super(Teacher,self).__init__(name,age,sex)
        super().__init__(name,age,sex) # 调用的是方法,自动传入对象

        self.level = level
        self.salary=salary

# print(Teacher.mro())
tea_obj=Teacher('egon',18,'male',10,3000)
print(tea_obj.__dict__)
{'name': 'egon', 'age': 18, 'sex': 'male', 'level': 10, 'salary': 3000}
# super()案例
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())

from A
from B
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]

Supongo que te gusta

Origin www.cnblogs.com/chenyoupan/p/12675974.html
Recomendado
Clasificación