如何为一个类本身(而不是类的实例)选择一个自定义的字符串表示形式?
如何为一个类本身(而不是类的实例)选择一个自定义的字符串表示形式?
考虑这个类:\n
class foo(object): pass
\n默认的字符串表示形式大致如下:\n
>>> str(foo) ""
\n我该如何使其显示为自定义字符串?\n
\n请参阅如何使用print()打印类的实例?以获取关于该类实例的相应问题。\n实际上,这个问题实际上是那个问题的特例 - 因为在Python中,类本身也是属于它们自己的类的对象 - 但是如何应用这个建议并不直接明显,因为默认的“类的类”是预定义的。
问题出现的原因是希望为一个类本身(而不是类的实例)选择自定义的字符串表示方式。解决方法是使用__repr__
方法或__str__
方法中的一个,如果选择__repr__
方法,因为默认情况下__str__
方法会调用__repr__
方法(当__str__
方法未定义时)。
下面是一个自定义的Vector3类的例子,其中__repr__
方法返回一个可以直接使用的字符串,而__str__
方法更适合用作调试输出:
class Vector3(object): def __init__(self, args): self.x = args[0] self.y = args[1] self.z = args[2] def __repr__(self): return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z) def __str__(self): return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z)
在这个例子中,通过repr(v)
和str(v)
分别输出了__repr__
方法和__str__
方法的结果:
v = Vector3([1,2,3]) print repr(v) #Vector3([1,2,3]) print str(v) #x:1, y:2, z:3
尽管关于__repr__
和__str__
的观点是正确的,但这并没有回答实际的问题,即关于类对象而不是实例的问题。
谢谢反馈,完全忽略了这一点。让我重新审查一下我的答案。
我认为你对repr
和str
的实现方式搞混了。
问题的出现原因是在给定的代码中,__str__和__unicode__方法被用来改变类的实例的字符串表示,而不是类本身的字符串表示。这可能会导致困惑,因为有时候我们需要改变类本身的字符串表示。
解决方法是使用__repr__方法来改变类本身的字符串表示。__repr__方法是一个特殊方法,用于返回一个对象的字符串表示形式,它通常用于调试和开发目的。下面是一个示例代码,展示了如何使用__repr__方法来改变类本身的字符串表示:
class foo(object): def __repr__(self): return "representation"
使用__repr__方法来改变类本身的字符串表示非常简单和直接。通过在类中定义__repr__方法,并返回所需的字符串表示,就可以实现这个目标。这样,当我们打印类的实例时,它们将显示为我们定义的字符串表示形式。
总结起来,要改变类本身的字符串表示,可以使用__repr__方法。这种方法非常简单和直接,只需在类中定义__repr__方法,并返回所需的字符串表示即可。
问题的原因是用户想要为一个类本身(而不是类的实例)选择一个自定义的字符串表示形式。解决方法有两种:
1. 实现类的元类中的`__str__()`或`__repr__()`方法。
class MC(type): def __repr__(self): return 'Wahaha!' class C(object): __metaclass__ = MC print(C)
2. 如果需要可读的字符串表示形式,使用`__str__()`方法;如果需要无歧义的表示形式,使用`__repr__()`方法。
此外,有用户建议使用类装饰器来设置自定义的字符串表示形式,但是这种方法在类定义时就需要设置,而不能在后续阶段使用类装饰器进行设置。
另外一个用户建议在元类的`__repr__()`方法中添加一个名为`_representation`的字符串,并在其中返回`self._representation`。还有一个用户建议创建一个元类工厂,用于生成具有适当`__repr__()`方法的元类。
对于Python 3,用户提出了一个问题,但没有给出解决方法。用户还提到了`repr(x)`实际上并不调用`x.__repr__()`方法,而是调用`x.__class__.__repr__(x)`方法,这在Python中是一个特殊的情况。