我希望能够做到这一点:
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)
这似乎是一个应该有一个简单解决方案的问题,但我无法想到或找到一个。
答案 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也支持常规函数,在该类之外定义一个函数,然后从普通方法调用该函数。调用者可以决定需要哪一个。