Python重写类(非实例)特殊方法

And*_*dré 12 python overriding class

如何覆盖类特殊方法?

我希望能够__str__()在不创建实例的情况下调用类的方法.例:

class Foo:
    def __str__(self):
        return 'Bar'

class StaticFoo:
    @staticmethod
    def __str__():
        return 'StaticBar'

class ClassFoo:
    @classmethod
    def __str__(cls):
        return 'ClassBar'

if __name__ == '__main__':
    print(Foo)
    print(Foo())
    print(StaticFoo)
    print(StaticFoo())
    print(ClassFoo)
    print(ClassFoo())
Run Code Online (Sandbox Code Playgroud)

生产:

<class '__main__.Foo'>
Bar
<class '__main__.StaticFoo'>
StaticBar
<class '__main__.ClassFoo'>
ClassBar
Run Code Online (Sandbox Code Playgroud)

应该:

Bar
Bar
StaticBar
StaticBar
ClassBar
ClassBar
Run Code Online (Sandbox Code Playgroud)

即使我使用@staticmethod@classmethod__str__依然采用内置Python定义__str__.它只在它Foo().__str__()代替时才起作用Foo.__str__().

Anu*_*yal 20

__str__在类中定义的特殊方法仅适用于该类的实例,为了在类的元类中必须执行类对象的不同行为,例如(python 2.5)

class Meta(type):
    def __str__(self):
        return "Klass"

class A(object):
    __metaclass__ = Meta

    def __str__(self):
        return "instance"

print A
print A()
Run Code Online (Sandbox Code Playgroud)

输出:

Klass
instance
Run Code Online (Sandbox Code Playgroud)