繁体   English   中英

Python覆盖类(非实例)的特殊方法

[英]Python overriding class (not instance) special methods

如何重写类的特殊方法?

我希望能够在不创建实例的情况下调用该类的__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())

产生:

<class '__main__.Foo'>
Bar
<class '__main__.StaticFoo'>
StaticBar
<class '__main__.ClassFoo'>
ClassBar

应该:

Bar
Bar
StaticBar
StaticBar
ClassBar
ClassBar

即使我使用@staticmethod@classmethod__str__依然采用了内置Python定义__str__ 仅当它是Foo().__str__()而不是Foo.__str__()时才起作用。

在类中定义的特殊方法__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()

输出:

Klass
instance

您为什么要滥用__str__的含义? 该方法名(像许多dunder方法名一样 )在Python中是特殊的,它是一个实例方法,其含义是“返回该类实例的字符串表示形式”。

如果您想要一个仅返回静态字符串的函数,则最好将其作为一个单独的函数而不包含在类中。

如果您想要一个返回新字符串的构造函数,请使用其他名称命名,以免破坏特殊的__str__名称。

如果您想要一种用于打印类表示形式的方法,则不应__str__使用名称__str__ 正如dunder风格的名称所暗示的那样,该名称应具有Python文档中定义的特定行为 选择一些名称(非俗名),您可以赋予自己特殊的含义,并且不要忘记将其命名为类方法。

我不确定您要做什么。 让我添加一些随机信息。

首先,添加此类:

class FooNew(object):
def __str__(self):
    return 'Fubar'

改为打印此:

if __name__ == '__main__':
    print "You are calling type for an old style class"
    print(Foo)
    print(type.__str__(Foo))
    print(Foo())
    print("But my Python 2.6 didn't match your output for print(Foo)")
    print("You are calling object.str() for a new style class")
    print(FooNew)
    print(object.__str__(FooNew))
    print(FooNew())
    print("Why do you want to change this?")

为了得到这个:

You are calling type for an old style class
__main__.Foo
<class __main__.Foo at 0xb73c9f5c>
Bar
But my Python 2.6 didn't match your output for print(Foo)
You are calling object.str() for a new style class
<class '__main__.FooNew'>
<class '__main__.FooNew'>
Fubar
Why do you want to change this?

您确定要不要调用类方法吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM