Python 用@staticmethod装饰调用
为什么我不能使用@staticmethod decorator使类“\uuuu call\uuuu”方法成为静态的Python 用@staticmethod装饰调用,python,decorator,static-methods,python-decorators,Python,Decorator,Static Methods,Python Decorators,为什么我不能使用@staticmethod decorator使类“\uuuu call\uuuu”方法成为静态的 class Foo(object): @staticmethod def bar(): return 'bar' @staticmethod def __call__(): return '__call__' print Foo.bar() print Foo() 输出 bar <__main__.Foo
class Foo(object):
@staticmethod
def bar():
return 'bar'
@staticmethod
def __call__():
return '__call__'
print Foo.bar()
print Foo()
输出
bar
<__main__.Foo object at 0x7fabf93c89d0>
您需要重写元类上的
\uuuuu调用
。类中定义的特殊方法是针对其实例的,要更改类的特殊方法,需要在其类中更改它们,即元类。(当您调用Foo()
时,通常顺序是:Meta.\uu调用\uuuuo()
-->Foo.\uu新建\uuuo()
-->Foo.\uu初始化\uuuuo()
,仅当它们正常返回时)
当您试图修改类实例化时,另一种方法是重写类本身上的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
并从中返回\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu调用
(当\uuuuuuu
谢谢那对我来说就清楚了。你所说的Meta.\uuuu call\uuuuuuuuuo()
-->Foo.\uuuu new\uuuuuuuuo()
-->Foo.\uuuuu init\uuuuuuuo()
?箭头是否表示“调用”?@fragapanagos这是类实例化时Python遵循的顺序。请参阅:是否可以通过从类型继承所需的类型来跳过元对象?
bar
__call__
class Meta(type):
@staticmethod
def __call__():
return '__call__'
class Foo(object):
__metaclass__ = Meta
@staticmethod
def bar():
return 'bar'
print Foo()
#__call__
class Foo(object):
def __new__(*args):
#ignore the args
return '__call__'
@staticmethod
def bar():
return 'bar'
print Foo()
#__call__