一个方法可以作为静态方法或实例方法使用吗?
我想要做到这个:
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
太邪恶了!