一个方法可以用作static方法还是实例方法?

时间:2011-04-28 01:17:35

标签: python static-methods descriptor instance-methods

我希望能够做到这一点:

class A(object):
    @staticandinstancemethod
    def B(self=None, x, y):
        print self is None and "static" or "instance"

A.B(1,2)
A().B(1,2)

这似乎是一个应该有一个简单解决方案的问题,但我无法想到或找到一个。

4 个答案:

答案 0 :(得分:9)

有可能,但请不要。我忍不住要实现它:

class staticandinstancemethod(object):
     def __init__(self, f):
          self.f = f

     def __get__(self, obj, klass=None):
          def newfunc(*args, **kw):
               return self.f(obj, *args, **kw)
          return newfunc

......及其用途:

>>> class A(object):
...     @staticandinstancemethod
...     def B(self, x, y):
...         print self is None and "static" or "instance"

>>> A.B(1,2)
static
>>> A().B(1,2)
instance

恶!

答案 1 :(得分:0)

由于您希望无论如何都要使用静态方法案例创建一个新类,您最好将其作为常规方法并在__init__方法的末尾调用它。

或者,如果您不希望这样,请在类外部创建一个单独的工厂函数,该函数将实例化一个新的空对象,并在其上调用所需的方法。

可能有一些方法可以完全满足你的要求,但是他们会在Python的内部机制中徘徊,混淆,在python 2.x和3.x之间不兼容 - 我看不出真正的需要为了它。

答案 2 :(得分:0)

根据您所说的,这是否与您所寻找的一致? 我不确定有没有办法完全你所说的“内置”

class Foo(object):
    def __init__(self, a=None, b=None):
        self.a
        self.b

    def Foo(self):
        if self.a is None and self.b is None:
            form = CreationForm()
        else: 
            form = EditingForm()
        return form

答案 3 :(得分:-3)

您的问题的答案是,您不能这样做。

我会做什么,因为Python也支持常规函数,在该类之外定义一个函数,然后从普通方法调用该函数。调用者可以决定需要哪一个。