Python类中的静态重载方法。缺少论证问题

时间:2015-10-08 20:02:52

标签: python python-3.x static-methods

我有一个类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个必需的位置参数...

似乎静态方法试图调用自身,但是我想让它调用另一个非静态方法。那么,我做错了什么?

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