具有静态和非静态重载的类方法

时间:2015-12-21 23:34:41

标签: python

我有一个方法MyClass的Python类do_something。我希望这个方法有一个可选参数some_param。到目前为止代码看起来像这样:

class MyClass(object):

    def __init__(self, some_param)
        self.some_param = some_param

    def do_something(some_param=None):
        if some_param:
            pass
        else:
            some_param = self.some_param

    @staticmethod
    def do_something_static(some_param):
        pass

是否可以让do_something_staticdo_something具有相同的名称?

换句话说:

如果提供some_param,我希望do_something成为静态方法。

如果未提供some_param,则它不是静态方法,因为它需要访问self.some_param

MyClass需要兼具两种功能,我希望将它们放在一个函数中,可以作为静态方法和非静态方法调用:是否可能?

为什么呢?我宁愿没有不同的功能做同样的事情。 do_something_static真的听起来像“我不知道如何做得更好”。我问的是,是否可以在静态方法中访问self,因为如果使用替换self的必需参数调用它,我将不会这样做。

2 个答案:

答案 0 :(得分:4)

如果我理解正确,你想要一个函数,如果它被称为方法将从self的属性中获取它的参数,但是否则直接使用它的单个参数。您可以在Python 3中执行此操作,其中未绑定的方法是普通的旧函数(但在Python 2中没有,其中未绑定的方法要求其第一个参数是实例)。

这是一个简单的例子:

class MyClass:
    def func(arg):
        if isinstance(arg, MyClass):
            # if we were called as arg.func(), get the actual arg value from an attribute
            arg = arg.some_attribute

        # do something with arg
        print(arg)

# MyClass.func can be called like a static method
MyClass.func("foo")

# or as a method of an instance of MyClass
instance = MyClass()
instance.some_attribute = "bar"
instance.func()

现在,我认为如果传递给静态方法的参数可能是类的一个实例(上面的代码将错误地识别为在实例上调用方法),那么这将无法执行您想要的操作。我不认为有一个很好的方法,不需要大量的描述符工作。

答案 1 :(得分:2)

为什么不使用普通功能:

def do_something(some_param):
    # do the work
    pass

并在课堂上使用它:

class MyClass(object):

    def __init__(self, some_param)
        self.some_param = some_param

    def do_something(some_param=None):
        if some_param:
            do_something(some_param)
        else:
            do_something(self.some_param)

实现只在函数内部,但您可以在方法中使用它。似乎是最简单的方法,可以避免重复功能。