python学习笔记DAY19(面向对象编程-绑定/非绑定方法)
这是我个人的学习笔记,都赖于(egon老师)的分享,以下是老师博客的原地址:
https://www.cnblogs.com/xiaoyuanqujing/articles/11640888.html
面向对象编程
类中定义的函数分为两大类:绑定方法和非绑定方法
一、绑定方法与非绑定方法
绑定方法:
- 特殊之处在于调用者本身当做第一个参数自动传入
- 绑定给对象的方法:调用者是对象,自动传入的也是对象
- 绑定给类的方法:调用者是类,自动传入的也是类
- 在类的正常定义中,函数默认是绑定到对象的,而为某个函数加上装饰器@classmethod后,该函数就绑定到了类。
# 配置文件settings中的内容
HOST = "172.0.31"
PORT = 8007
# 类方法的应用
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)
# 如果不加方法,那就只能对象自己来调用from_conf来初始化,变成类自己的方法之后,类自己就初始化好了,所有对象之间调用即可
print(MySql.from_conf) # 绑定到类的方法 <bound method MySql.from_conf of <class '__main__.MySql'>>
conn = MySql.from_conf() # 调用类方法,自动将类MySql当做第一个参数传给cls
------------------------------------------华丽分隔线--------------------------------------------------
以上实例,其实 obj = Mysql(settings.IP,settings.PORT)这种实例haul的方式也可达到获取对应值的效果,但是,如果多个对象
都需要这两个值,最好的办法就就是在类体内就初始化好。
重点:大多数情况下,@classmethod,都是在提供一种新的造对象的方式,(关键在于给函数体传入的参数是类本身)而类,本身就是为了造对象来初始化的。
绑定到类的方法就是专门给类用的,其实对象也可以调用,只不过自动传入的第一个参数仍然是类,也就是说这种调用是没有意义的,并且容易引起混淆,这也是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("172.0.31",8007)
print(conn.id) # 6a7ad7ea-c2ad-11eb-b7b0-fcaa14c35220
# 类或对象来调用create_id 发现都是普通函数
print(MySql.create_id) # <function MySql.create_id at 0x000001FCEC654CA0>
print(conn.create_id) # <function MySql.create_id at 0x000001FCEC654CA0>
总结:绑定方法与非绑定方法的使用:若类中需要一个功能,该功能的实现代码中需要引用对象,则要将其定义成对象方法;需要引用类,则要将其定义成非绑定方法;如果无需引用类或对象,则要将其定义成静态方法。

浙公网安备 33010602011771号