zoukankan      html  css  js  c++  java
  • Python学习————绑定方法

    一:Python多继承的正确打开方式:minins机制

    Mixins核心:在多继承背景下,尽可能地提升多继承的可读性

    让多继承满足人的思维习惯 ==> 什么 是 什么

    class Vehicle:  # 交通工具
        def fly(self):
            print("I am flying")
    
    
    class CivilAircraft(Vehicle):  # 民航飞机
        pass
    
    
    class Helicopter(Vehicle):  # 直升飞机
        pass
    
    
    class Car(Vehicle):  # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
        pass
    class Vehicle:  # 交通工具
        pass
    
    
    class Flyable:	# 新建一个类Flyable,只当做可飞行交通工具的父类
        def fly(self):
            print("I am flying")
    
    
    class CivilAircraft(Vehicle, Flyable):  # 民航飞机
        pass
    
    
    class Helicopter(Vehicle, Flyable):  # 直升飞机
        pass
    
    
    class Car(Vehicle):
        pass
    

      Python语言可没有接口功能,但是它可以多重继承。那Python是不是就该用多重继承来实现呢?是,也不是。说是,因为从语法上看,的确是通过多重继承实现的。说不是,因为它的继承依然遵守”is-a”关系,从含义上看依然遵循单继承的原则。

    class Vehicle:  # 交通工具
        pass
    
    
    class FlyableMixin:		# 加一个Mixin结尾,可以当做一个假父类混入区中
        def fly(self):
            print("I am flying")
    
    
    class CivilAircraft(Vehicle, FlyableMixin):  # 民航飞机
        pass
    
    
    class Helicopter(Vehicle, FlyableMixin):  # 直升飞机
        pass
    
    
    class Car(Vehicle):  # 汽车并不会飞,但按照上述继承关系,汽车也能飞了
        pass
    

    绑定方法

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

    类方法通常用来在__init__的基础上提供额外的初始化实例的方式

    # 配置文件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
    

    绑定到类的方法就是专门给类用的,但其实对象也可以调用,只不过自动传入的第一个参数仍然是类,也就是说这种调用是没有意义的,并且容易引起混淆,这也是Python的对象系统与其他面向对象语言对象系统的区别之一,比如Smalltalk和Ruby中,绑定到类的方法与绑定到对象的方法是严格区分开的。

    非绑定方法

    为类中某个函数加上装饰器@staticmethod后,该函数就变成了非绑定方法,也称为静态方法。该方法不与类或对象绑定,类与对象都可以来调用它,但它就是一个普通函数而已,因而没有自动传值那么一说

    import uuid
    class MySQL:
        def __init__(self,host,port):
            self.id=self.create_id()
            self.host=host
            self.port=port
        @staticmethod
        def create_id():
            return uuid.uuid1()
    
    >>> conn=MySQL(‘127.0.0.1',3306)
    >>> print(conn.id) #100365f6-8ae0-11e7-a51e-0088653ea1ec
    
    # 类或对象来调用create_id发现都是普通函数,而非绑定到谁的方法
    >>> MySQL.create_id
    <function MySQL.create_id at 0x1025c16a8>
    >>> conn.create_id
    <function MySQL.create_id at 0x1025c16a8>
    

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

  • 相关阅读:
    【故障处理】ORA-12162: TNS:net service name is incorrectly specified (转)
    android studio 编程中用到的快捷键
    java时间格式串
    android Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.
    linux安装vmware
    x1c 2017 安装mint18的坑——grub2
    x1c2017 8G版 win linux的取舍纠结记录
    python的try finally (还真不简单)
    kafka+docker+python
    json文件不能有注释
  • 原文地址:https://www.cnblogs.com/x945669/p/12677067.html
Copyright © 2011-2022 走看看