Python 用@staticmethod装饰调用

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

为什么我不能使用@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 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__