gpt4 book ai didi

python - 使用继承编写 __repr__ 函数的正确方法

转载 作者:太空狗 更新时间:2023-10-29 17:47:58 24 4
gpt4 key购买 nike

我正在试验 OOP python,我不确定 __repr__ 函数继承。由于父类函数看起来像这样:

def __repr__(self):
'''Returns representation of the object'''
return("{}({!r})".format("Class name", self._param))

我想知道使用像下面这样的通用方法(也适用于 child 类(class))是否更好:

def __repr__(self):
'''Returns representation of the object'''
return("{}({!r})".format(self.__class__.__name__, self._param))

或者在每个类中重写该函数是否是一个好习惯。

此外,请忽略编码部分,因为我将其放在后面。

最佳答案

__repr__ 在 Python 的数据模型中有特殊意义:

object.__repr__(self)

Called by the repr() built-in function to compute the “official” string representation of an object. If at all possible, this should look like a valid Python expression that could be used to recreate an object with the same value (given an appropriate environment). If this is not possible, a string of the form <...some useful description...> should be returned. The return value must be a string object. If a class defines __repr__() but not __str__(), then __repr__() is also used when an “informal” string representation of instances of that class is required.

This is typically used for debugging, so it is important that the representation is information-rich and unambiguous.

这意味着 __repr__ 返回的字符串应该可以用来创建另一个类似的对象。所以__repr__经常需要覆盖的东西,不是因为 __class__.__name__但是因为必须在表示中捕获“状态”。

class A(object):
def __init__(self, param):
self._param = param

def __repr__(self):
'''Returns representation of the object'''
return("{}({!r})".format(self.__class__.__name__, self._param))

那么你绝对应该覆盖 __repr__当您为 __init__ 添加参数时:

class B(A):
def __init__(self, param1, param2):
self._param = param1
self._param2 = param2

def __repr__(self):
'''Returns representation of the object'''
return("{}({!r})".format(self.__class__.__name__, self._param, self._param2))

但如果 __repr__父类(super class)仍然准确地“描述”子类,那么重载 __repr__ 就没有意义了。 :

class B(A):
pass

然而,使用 self.__class__.__name__ 始终是一个不错的选择避免对类名进行硬编码,以防万一您或其他人对其进行子类化。

关于python - 使用继承编写 __repr__ 函数的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44342081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com