一、在类内部定义的函数,分为两大类:
1、绑定方法,绑定给谁,就应该由谁来调用,谁来调用就会把调用者当做第一个参数自动传入
绑定到对象的方法:在类内定义的没有被任何装饰器的方法
1 class Foo: 2 def __init__(self, name): 3 self.name = name 4 5 def tell(self): 6 print('名字是%s' % self.name) 7 8 f = Foo('abc') 9 print(Foo.tell) 10 def func():pass 11 print(func) 12 print(f.tell) 13 14 结果为: 15 <function Foo.tell at 0x000002DCCBA6C620> 16 <function func at 0x000002DCCB461E18> 17 <bound method Foo.tell of <__main__.Foo object at 0x000002DCCB7DDEB8>>
类里面定义的函数与对类来说与普通函数来说没有什么区别,一般是绑定到对象的,
绑定到类的方法:在类内定义的被装饰器classmethod修饰的方法
1 class Foo: 2 def __init__(self, name): 3 self.name = name 4 5 def tell(self): 6 print('名字是%s' % self.name) 7 8 @classmethod 9 def func(cls): # cls = Foo 10 print(cls) 11 12 print(Foo.func) 13 14 结果为: 15 16 <bound method Foo.func of <class '__main__.Foo'>>
可以直接执行Foo.func(),结果为:
<class '__main__.Foo'>
2、非绑定方法:没有自动传值这么一说了,就是类中定义的一个普通工具,对象和类都可以使用
非绑定方法:不与类或者对象绑定
1 class Foo: 2 def __init__(self, name): 3 self.name = name 4 5 def tell(self): 6 print('名字是%s' % self.name) 7 8 @classmethod 9 def func(cls): 10 print(cls) 11 12 @staticmethod 13 def func1(x, y): 14 return x + y 15 16 # print(Foo.func) 17 # Foo.func() 18 f = Foo('abc') 19 print(Foo.func1) 20 print(f.func1) 21 22 结果为: 23 24 <function Foo.func1 at 0x000002C0AB41C730> 25 <function Foo.func1 at 0x000002C0AB41C730>
Foo.func1(1, 2)
f.func1(1, 3)
结果为:
1 3 2 4