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):学python需要什么
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.ate_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发现都是普通函数,⽽⾮绑定到谁的⽅法
>>> ate_id
<ate_id at 0x1025c16a8>
>>> ate_id
<ate_id at 0x1025c16a8>
总结绑定⽅法与⾮绑定⽅法的使⽤:若类中需要⼀个功能,该功能的实现代码中需要引⽤对象则将其定义成对象⽅法、需要引⽤类则将其定义成类⽅法、⽆需引⽤类或对象则将其定义成静态⽅法。