(9)绑定方法和非绑定方法
绑定方法
@classmethod 函数功能上面添加这个内置函数就是绑定给类
绑定给类的,参数里面就是cls,cls这个是规范的写法,cls就是指传入的是类
特殊之处:
绑定给谁就应该由谁来调用,会将调用者(点左边的就是调用者)当做第一个参数自动传入
绑定对象的方法:
类中定义的函数在没有被任何装饰器装饰的情况下,默认就是绑定给对象的,绑定给对象的方法应该由对象来调用,自动传入的是对象
绑定类的方法:
为类中定义的函数添加装饰器classmethod,绑定类的方法应该由类来调用,自动传入的是类
非绑定方法(指的就是函数)
@staticmethod 函数功能上面添加这个内置函数,就是非绑定方法
特殊之处: 就是一个普通函数,既不与类绑定也不与对象绑定,意味着谁都可以来调用,无论谁调用都只是
一个普通函数而已,没有自动传值的效果
绑定方法实例
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def tell_info(self):
print('<%s:%s>' %(self.name,self.age))
@classmethod #这里绑定给类,就必须是类来调用
def func1(cls):
print(cls)
print(People.func1)#这个查看属性
People.func1() #这里就是用类来调用下面的功能
obj = People('egon',18) #也能用对象来调用
print(obj.func1) #查看属性
obj.func1() #对象调用的时候还是调用了类
PS:绑定给类的传入的一定是类,绑定给对象的传入的一定是对象
PS:绑定给类的,对象也能调用,但是对象调用时候传入的还是类
PS:绑定给对象的方法,类也能调用,但是类调用的时候就是一个普通函数
PS:绑定方法就是将类变成一个变量的形式传入,这样写的时候不管变量名如何改变,传入的值都会跟着改变,程序更有灵活性
非绑定给方法实例
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def tell_info(self): #这里类访问的时候是一个函数,对象访问的时候就是一个绑定给对象的方法
print('<%s:%s>' %(self.name,self.age))
@classmethod #这里是绑定方法
def func1(cls):
print(cls)
@staticmethod #这里是非绑定方法,不与任何人绑定
def func2(x,y):#这里有参数调用的时候必须传入参数,没有就不用传
print('=======run',x,y)
obj=People('egon',18)
print(People.func2)#这里打印类调用看到是是函数
print(obj.func2) #这里打印对象调用看到的是函数
PS:所以非绑定方法不管是类调用还是对象调用python里面都变成了函数,不与任何人绑定
People.func2(1,2) #非绑定对象就是一个普通函数,调用时候就按照普通函数的方法运行,需要传入参数就要传入
obj.func2(1,2) #非绑定对象就是一个普通函数,调用时候就按照普通函数的方法运行,需要传入参数就要传入
类中定义的函数可以分为两大类三小种
两大类就是绑定和非绑定
三小种就是
1、没有被装饰器装饰过的(属于默认绑定给对象,这种函数一定要有一个参数self),默认由对象来调用,自动传值,类也能调用,但是类调用就是一个普通函数,必须按照普通函数的规则和参数来调用
2、被classmethod装饰过的(默认绑定给类的),应该由类来调用,会将类自动传入,对象也能调用,但是对象调用传入的还是类
3、被staticmethod装饰过的(非绑定),谁都可以调用,就是一个普通函数,普通函数没有自定传值
绑定与非绑定实例(使用的具体场景)
import settings #seting #文件里面放了参数,让下面的代码调用
class MySQL:
def __init__(self,ip,port):
self.id=self.create_id() #定义类阶段内部代码都已运行,所以这行代码可以访问到
self.ip=ip
self.port=port
def tell_info(self): #查看功能
print('<%s:%s>' %(self.ip,self.port))
@classmethod #绑定方法将类以变量形式传入
def from_conf(cls): #从文件内读取参数
return cls(settings.IP,settings.PORT)
@staticmethod #非绑定方法,增加一个独一无二的ID值
def create_id():
import uuid #调用uuid模块
return uuid.uuid4()
PS:uuid模块,每次调用产生不同的ID编号
obj=MySQL('1.1.1.1',3306)
print(obj.id) #对象调用ID,产生一个对象独一无二的ID,这里查看ID
obj1=MySQL.from_conf() #类赋值给对象
obj1.tell_info() #通过对象调用完成实例化参数
PS:classmethod就是为了给类新增一种或多种实例化方式,新增一种指的是实例化的时候值得来源不同