我有一个类db
定义如下:
class db:
def __init_(self, idx, host, port, db_name, user, password):
self.idx = idx
...
def Connect(self):
conn = db_engine.connect(host=self.host, ...)
@staticmethod
def Connect(idx):
if idx == 1:
d = db(1, "localhost", 80, ...)
conn = d.Connect()
return conn
所以,正如你所看到的,我的班级有两种方法。最重要的是,它有一个静态方法Connect
,它在内部尝试调用非静态方法Connect
。但是,当我尝试使用我的程序时,我收到一条错误消息:
d.Connect()
TypeError:Connect()缺少1个必需的位置参数...
似乎静态方法试图调用自身,但是我想让它调用另一个非静态方法。那么,我做错了什么?
答案 0 :(得分:3)
您重新定义了 select
...
from
(
select
...
,sum(case when subcategory = 'GAMECONSOLE' then 1 else 0 end)
over (partition by category, description, section) as cnt
from tab
) dt
where cnt > 0
方法。 Python不支持重载;你不能定义常规方法和静态方法。您仅具有Count
版本,因为它是最后定义的,它完全取代了非静态版本。
如果你需要一种方法来改变它的行为,那么它是否受约束(静态与常规方法)你有两个选择;要么测试staticmethod
参数的类型(它是一个整数还是self
类的实例),要么你必须构建一个自定义descriptor object这可以改变基于上下文调用方法的方式;在一个实例或类上。
测试db
的类型如下:
self
如果使用自定义描述符,您可以构建一个支持两个不同功能的like the property
object does:
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
然后像这样使用它:
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