一. 绑定方法与非绑定方法介绍
# 注意!!: 绑定方法与非绑定方法存在的意义就是修改类中函数的一种归属, 让类中函数发挥最大的作用.
"""
类中定义的函数分为两大类:绑定方法和非绑定方法
绑定方法: 绑定到对象的方法和绑定到类的类方法
非绑定方法: 该方法不与类或对象绑定
"""
二. 绑定方法: 特殊之处在于将调用者本身当做第一个参数自动传入
# 绑定方法: 绑定到类的方法@classmethod
"""
设计者可以通过@classmethod装饰器来提供一种给类使用的接口, 用来提供一种新的使用类造对象的方式
"""
import settings
'''
当前执行文件下创建settings.py, 放入一下代码:
IP = '127.0.0.1'
PORT = 8080
'''
class MySql:
def __init__(self, ip, port):
self.ip = ip
self.port = port
def tell_info(self):
print(f'{self.ip}:{self.port}')
print(classmethod) # <class 'classmethod'>
@classmethod # 类装饰器classmethod, 将下面的函数装饰成绑定给类的方法
def from_conf(cls):
print(cls)
return cls(settings.IP, settings.PORT)
# 1. 使用类直接实例化创建对象
obj = MySql(settings.IP, settings.PORT)
obj.tell_info()
# 2. 使用类方法提供的接口来创建对象
obj1 = MySql.from_conf()
obj1.tell_info()
三. 非绑定方法/静态方法
# 注意!!: 非绑定方法没有绑定给任何人:调用者可以是类、对象,没有自动传参的效果
"""
没有绑定给任何人:调用者可以是类、对象,没有自动传参的效果
"""
class MySql:
def __init__(self, ip, port):
self.uuid = self.create_id()
self.ip = ip
self.port = port
@staticmethod # 将下述函数装饰成一个静态方法
def create_id():
import uuid
return uuid.uuid4()
@classmethod
def f1(cls):
pass
def f2(self):
pass
obj1 = MySql('1.1.1.1', 3306)
print(obj1.create_id) # 被静态方法装饰对象就是类中一个普通的函数. <function MySql.create_id at 0x000002037B9CCDC0>
# 对象的绑定方法, 类的绑定方法与之对比
print(obj1.f2) # <bound method MySql.f2 of <__main__.MySql object at 0x000002C07E59FC10>>
print(obj1.f1) # <bound method MySql.f1 of <class '__main__.MySql'>>
# 静态方法对象或者类调用都是一个普通的函数没有自动传参的效果
print(obj1.create_id())
print(MySql.create_id())