Python——绑定与非绑定方法

绑定方法与非绑定方法

绑定方法

  • 特殊之处:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入
  • 绑定给对象的方法:在类中定义函数没有被任何装饰器修饰的情况下,默认就是绑定对象的
  • 绑定给类的方法:为类中定义函数添加一个装饰器classmethod,就是绑定类的

非绑定方法

  • 特殊之处:非绑定方法就是一个普通函数,即不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值效果。
  • 非绑定方法:为类中定义函数添加一个装饰器staticmethod,就是非绑定方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class Foo:
def func1(self):
print('func',self)

# 绑定给类方法
@classmethod
def func2(cls):
print('func2',cls)

# 非绑定方法,既不与类绑定又不与对象绑定
@staticmethod
def func3(x,y):
print('func3',x,y)

obj = Foo()
# 一、绑定给对象
obj.func1()
print(obj)
# <__main__.Foo object at 0x107f7ee48>

# 绑定给对象的方法,类也可以调用,但是类调用就是一个普通函数,
# 没有自动传值的效果
# Foo.func1() # 需要传值
Foo.func1(obj)

# 二、绑定给类的方法
# 绑定给类的,应该由类来调用
print(Foo.func2)
print(obj.func2)
Foo.func2()
obj.func2()

# 三、非绑定方法
print(obj.func3)
print(Foo.func3)

obj.func3(1,2)
Foo.func3(1,3)



# case
import settings

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:%s>' % (self.id,self.ip, self.port))

@classmethod
def from_conf(cls):
return cls(settings.IP, settings.PORT)

@staticmethod
def create_id():
import uuid
return uuid.uuid4()

# obj=MySQL('1.1.1.1.1',3406)
# obj1=MySQL('1.1.1.2',3406)
# obj.tell_info()
print(MySQL.from_conf)
a = MySQL.from_conf() # 要有变量接受返回值
# 用a调用传入返回值
a.tell_info()