类中定义的函数分成两大类
一:绑定方法(绑定给谁,就应该由谁来调用,谁来调用就会把调用者当作第一个参数传入):
-
绑定到类的方法:用classmethod装饰器装饰的方法。
- 绑定到对象的方法:在类内定义的没有被任何装饰器修饰的
二:非绑定方法
非绑定方法:不与类或对象绑定,没有自动传值一说,就是类中定义的一个普通工具,类和对象都能使用
class Foo: def __init__(self, name): self.name = name def tell(self): print('名字是%s' %self.name) @classmethod def func(cls): # cls是class的缩写,提示这是绑定到类的方法 cls=Foo print(cls) @staticmethod def func1(x, y): return x + y # 绑定到对象的方法,对象是调用者,直接把对象作为参数传入 f = Foo('egon') print(Foo.tell) # <function Foo.tell at 0x0000027FCC1A8840> print(f.tell) # <bound method Foo.tell of <__main__.Foo object at 0x0000027FCC101390>> # 绑定到类的方法,类是调用者,直接把类作为参数传入 print(Foo.func()) # <class '__main__.Foo'> print(Foo) # <class '__main__.Foo'> # 非绑定方法,不存在自动传值一说,类和对象都能调用 print(Foo.func1) # <function Foo.func1 at 0x0000025AF41F8BF8> print(f.func1) # <function Foo.func1 at 0x0000025AF41F8BF8>
绑定方法与非绑定方法的使用
import settings, hashlib, time class People: def __init__(self, name, age, sex): self.id = self.creat_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 creat_id( ): m = hashlib.md5(str(time.time()).encode('utf-8')) return m.hexdigest() # 绑定给对象,就应该由对象来调用,自动将对象本身当作第一个参数传入 p = People('egon', 18, 'male') p.tell_info() # tell_info(p) Name: egon Age: 18 Sex: male # 绑定给类,就应该由类来调用,自动将类本身当作第一个参数传入 p = People.from_conf() # from_conf(People) p.tell_info() # Name: alex Age: 18 Sex: female # 非绑定方法,不与类或对象绑定,谁都可以调用,没有自动传值一说 p1 = People('egon1', 18, 'male') p2 = People('egon2', 28, 'male') print('P1>>%s \nP2>>%s'%(p1.id, p2.id)) # P1>>3f983deaffdb39bbfc92cc721ccd74cf \n P2>>3f983deaffdb39bbfc92cc721ccd74cf