一个方法可以作为静态方法或实例方法使用吗?

5 投票
4 回答
647 浏览
提问于 2025-04-16 16:33

我想要做到这个:

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

根据你说的内容,这是不是你想要的方向?我不太确定有没有一种“内置”的方法可以做到你所说的“完全”那样。

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
0

既然你想用静态方法来创建一个新类,那不如直接把它做成一个普通的方法,然后在__init__方法的最后调用它。

或者,如果你不想这样做,可以在类外面创建一个单独的工厂函数,这个函数会实例化一个新的空对象,然后在这个对象上调用你想要的方法。

其实是有办法做到你想要的效果,但那样会涉及到Python内部的一些机制,可能会让人感到困惑,而且在Python 2.x和3.x之间也不兼容——我觉得没有必要这么复杂。

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

太邪恶了!

撰写回答