Welcome

python调用非绑定方法

今天在看 werkzeug 的源码的时候看到一种写法,先上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class BaseWSGIServer(HTTPServer, object):
def __init__(self, host, port, app, handler=None, passthrough_errors=False, ssl_context=None, fd=None):
...
HTTPServer.__init__(self, (host, int(port)), handler)
...
def serve_forever(self):
...
try:
HTTPServer.serve_forever(self)
except KeyboardInterrupt:
pass
finally:
self.server_close()
...

这段是通过调用python的第三方模块来创建一个服务的核心代码。
为什么我觉得惊喜,因为我知道init是一个对象方法,而不是一个类方法,但是现在 HTTPServer.init(self, (host, int(port)), handler) 这样子的调用方式明明就是类方法的调用方式ORZ(喷血

这个是类在调用一个非绑定的方法的例子,其实在python中,在类中定义好方法,那时候方法是没有绑定的,只有到实例成对象之后,通过对象来调用方法,这时候方法就绑定到了该对象上面,我们每个实例方法前面的第一个参数self就是那个对象。
因为self是python语言传的值,那么是否可以自己传值,答案是可以的,举个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
class A(object):
def __init__(self, name):
self.name = name
def say():
print self.name
a = object.__new__(A)
A.__init__(a, 'some')
A.say(a)
# output:
# some

调用非绑定的方法一般只是在派生类的地方会使用,当然直接使用super也是可以的,但是我们也知道,如果是使用super的话实际上是会实例出来多一个对象,但是如果是使用调用非绑定方法的方式的话,其实没有实例出一个新的对象,调用的对象还是只有一个对象。