python入行030(mixins机制派生与方法重用)

Posted mmmmmrz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python入行030(mixins机制派生与方法重用)相关的知识,希望对你有一定的参考价值。

1 mixins机制

  多继承的正确打开方式:mixins机制(其实就是类的多继承背景下代码编写规范)

  mixins机制核心:就是在多继承背景下尽可能地提升多继承的可读性

  ps:让多继承满足人的思维习惯=》什么"是"什么

class Vehicle:  # 交通工具
    pass


class FlyableMixin:
    def fly(self):
        ‘‘‘
        飞行功能相应的代码        
        ‘‘‘
        print("I am flying")


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


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


class Car(Vehicle):  # 汽车
    pass

# ps: 采用某种规范(如命名规范)来解决具体的问题是python惯用的套路

 2 派生与方法重用

# 在子类派生的新方法中如何重用父类的功能
# 方式一:指名道姓调用某一个类下的函数
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 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

 3 多态

  多态指的是一类事物有多种形态,比如动物有多种形态:猫、狗、猪;

  多态性指的是可以在不用考虑对象具体类型的情况下而直接使用对象;

  多态性的本质在于不同的类中定义有相同的方法名。

  但其实我们完全可以不依赖于继承,只需要制造出外观和行为相同对象,同样可以实现不考虑对象类型而使用对象,这正是Python崇尚的“鸭子类型”(duck typing)。

4 绑定方法与非绑定方法

  4.1 绑定方法

  ? 类中定义的函数分为两大类:绑定方法和非绑定方法,? 其中绑定方法又分为绑定到对象的对象方法和绑定到类的类方法。

  ? 在类中正常定义的函数默认是绑定到对象的,而为某个函数加上装饰器@classmethod后,该函数就绑定到了类。

# 配置文件settings.py的内容
HOST=127.0.0.1
PORT=3306

# 类方法的应用
import settings
class MySQL:
    def __init__(self,host,port):
        self.host=host
        self.port=port
    @classmethod
    def from_conf(cls): # 从配置文件中读取配置进行初始化
        return cls(settings.HOST,settings.PORT)

>>> MySQL.from_conf # 绑定到类的方法
<bound method MySQL.from_conf of <class__main__.MySQL>>
>>> conn=MySQL.from_conf() # 调用类方法,自动将类MySQL当作第一个参数传给cls

  绑定到类的方法就是专门给类用的,但其实对象也可以调用,只不过自动传入的第一个参数仍然是类,也就是说这种调用是没有意义的。

  4.2 非绑定方法

  为类中某个函数加上装饰器@staticmethod后,该函数就变成了非绑定方法,也称为静态方法。

  该方法不与类或对象绑定,类与对象都可以来调用它,但它就是一个普通函数而已,因而没有自动传值那么一说。

  总结绑定方法与非绑定方法的使用:若类中需要一个功能,该功能的实现代码中需要引用对象则将其定义成对象方法、需要引用类则将其定义成类方法、

  无需引用类或对象则将其定义成静态方法。

 

以上是关于python入行030(mixins机制派生与方法重用)的主要内容,如果未能解决你的问题,请参考以下文章

Mixins多态绑定方法与非绑定方法

mixin 的顺序如何影响派生类?

哪个是密码版本5的方法密钥派生(MKD)

从mixin到new和prototype:Javascript原型机制详解

从mixin到new和prototype:Javascript原型机制详解

Python --类和实例