如何为一个类本身(而不是类的实例)选择一个自定义的字符串表示形式?

16 浏览
0 Comments

如何为一个类本身(而不是类的实例)选择一个自定义的字符串表示形式?

考虑这个类:\n

class foo(object):
    pass

\n默认的字符串表示形式大致如下:\n

>>> str(foo)
""

\n我该如何使其显示为自定义字符串?\n


\n请参阅如何使用print()打印类的实例?以获取关于该类实例的相应问题。\n实际上,这个问题实际上是那个问题的特例 - 因为在Python中,类本身也是属于它们自己的类的对象 - 但是如何应用这个建议并不直接明显,因为默认的“类的类”是预定义的。

0
0 Comments

问题出现的原因是希望为一个类本身(而不是类的实例)选择自定义的字符串表示方式。解决方法是使用__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__的观点是正确的,但这并没有回答实际的问题,即关于类对象而不是实例的问题。

谢谢反馈,完全忽略了这一点。让我重新审查一下我的答案。

我认为你对reprstr的实现方式搞混了。

0
0 Comments

问题的出现原因是在给定的代码中,__str__和__unicode__方法被用来改变类的实例的字符串表示,而不是类本身的字符串表示。这可能会导致困惑,因为有时候我们需要改变类本身的字符串表示。

解决方法是使用__repr__方法来改变类本身的字符串表示。__repr__方法是一个特殊方法,用于返回一个对象的字符串表示形式,它通常用于调试和开发目的。下面是一个示例代码,展示了如何使用__repr__方法来改变类本身的字符串表示:

class foo(object):
    def __repr__(self):
        return "representation"

使用__repr__方法来改变类本身的字符串表示非常简单和直接。通过在类中定义__repr__方法,并返回所需的字符串表示,就可以实现这个目标。这样,当我们打印类的实例时,它们将显示为我们定义的字符串表示形式。

总结起来,要改变类本身的字符串表示,可以使用__repr__方法。这种方法非常简单和直接,只需在类中定义__repr__方法,并返回所需的字符串表示即可。

0
0 Comments

问题的原因是用户想要为一个类本身(而不是类的实例)选择一个自定义的字符串表示形式。解决方法有两种:

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中是一个特殊的情况。

0