Python----面向对象---绑定方法与非绑定方法

时间:2022-11-13 17:20:59

一、在类内部定义的函数,分为两大类:

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