您重新定义了Count 方法。 Python 不支持重载;您不能同时定义常规方法和静态方法。您只有拥有 staticmethod 版本,因为它是最后定义的,它完全取代了非静态版本。
如果你需要一个方法来改变它的行为是否基于它是否被绑定(静态与常规方法),你有两个选择;要么测试self 参数的类型(它将是一个整数或db 类的一个实例),或者你必须构建一个自定义的descriptor object,它可以改变你的方法被调用的方式上下文;在实例或类上。
测试self 的类型如下所示:
class db:
def __init_(self, idx, host, port, db_name, user, password):
self.idx = idx
# ...
def Connect(self_or_idx):
if isinstance(self_or_idx, db):
self = self_or_idx
conn = db_engine.connect(host=self.host, ...)
# ...
else:
idx = self_or_idx
if idx == 1:
d = db(1, "localhost", 80, ...)
conn = d.Connect()
return conn
如果使用自定义描述符,您可以构建一个支持两种不同功能的描述符like the property object does:
class static_or_instance_method(object):
def __init__(self, instancemethod=None, staticmethod=None):
self.method = instancemethod
self.static = staticmethod
def staticmethod(self, staticmethod):
return type(self)(self.method, staticmethod)
def instancemethod(self, instancemethod):
return type(self)(instancemethod, self.static)
def __get__(self, instance, cls=None):
if instance is None:
return self.static
return self.method.__get__(instance, cls)
然后像这样使用它:
class db:
def __init_(self, idx, host, port, db_name, user, password):
self.idx = idx
# ...
@static_or_instance_method
def Connect(self):
conn = db_engine.connect(host=self.host, ...)
# ...
@Connect.staticmethod
def Connect(idx):
if idx == 1:
d = db(1, "localhost", 80, ...)
conn = d.Connect()
return conn
描述符的快速演示:
>>> class Foo:
... @static_or_instance_method
... def bar(self):
... return 'Bound method of {}'.format(self)
... @bar.staticmethod
... def bar(arg):
... return 'Static method, receiving argument {}'.format(arg)
...
>>> Foo().bar()
'Bound method of <__main__.Foo object at 0x10b6cf588>'
>>> Foo.bar('spam')
'Static method, receiving argument spam'