在函数内部定义的函数,分绑定方法与非绑定方法
绑定方法:绑定给谁,由谁使用,谁调用就会把谁当第一个参数传入。
绑定到对象的方法:在类内定义的没有被任何装饰器装饰的方法。
class Foo: def __init__(self,name): self.name=name def tell(self): print('名字是%s' % self.name) f=Foo('ya') print(Foo.tell) print(f.tell)
绑定到类的方法:在类内定义的被装饰器classmethod修饰的方法,那个类使用,则将谁当第一个参数传入
class Foo: def __init__(self,name): self.name=name def tell(self): print('名字是%s' % self.name) @classmethod def func(cls): print(cls)
Foo.func()
非绑定方法:没有自动传值动作
不与类或对象绑定的方法,类和对象都可以使用,当普通方法使用
class Foo: def __init__(self,name): self.name=name def tell(self): print('名字是%s' % self.name) @classmethod def func(cls): print(cls) @staticmethod def func1(x,y): return x+y f=Foo('ya') print(Foo.func1(10,10)) print(f.func1(20,20))
绑定与非绑定使用
class People: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def tell_info(self): #这里需要一个对象进来,所以必须绑定到对象,即绑定到对象的方法 print("Name:%s Age:%s Sex:%s" % (self.name,self.age,self.sex)) p=People('ya','18','male') #绑定给对象,就应该由对象来调用,自动将对象本身当作第一个参数传入 p.tell_info()
绑定到类的方法,让类方法动态从配置文件中读取配置文件
import settings class People: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def tell_info(self): #这里需要一个对象进来,所以必须绑定到对象,即绑定到对象的方法 print("Name:%s Age:%s Sex:%s" % (self.name,self.age,self.sex)) @classmethod def from_conf(cls): #绑定给类的,就应该由类来调用 obj=cls( settings.name, settings.age, settings.sex ) return obj p=People.from_conf() p.tell_info()
非绑定方法,类和对象都可使用,不依赖类和对象,无需将类或对象当第一个参数传入,即没有自动传参一说,当普通方法使用即可
import settings import hashlib import time class People: def __init__(self,name,age,sex): self.id=self.create_id() self.name=name self.age=age self.sex=sex def tell_info(self): #这里需要一个对象进来,所以必须绑定到对象,即绑定到对象的方法 print("Name:%s Age:%s Sex:%s" % (self.name,self.age,self.sex)) @classmethod def from_conf(cls): #绑定给类的,就应该由类来调用 obj=cls( settings.name, settings.age, settings.sex ) return obj @staticmethod def create_id(): #创建用户id,不依赖类与对象,谁都可以使用,没有自动传参一说 m=hashlib.md5(str(time.time()).encode('utf-8')) return m.hexdigest() p1=People('ya','18','male') p2=People('ya','28','male') p3=People('ya','38','male') print(p1.id) print(p2.id) print(p3.id)