如何覆盖python中的列表获取对象
问题描述:
我想实现一个从内置类列表继承的类并重写一个方法,当我得到这个类的一个实例时,我可以返回一个自定义数据,这有可能吗?如何覆盖python中的列表获取对象
class MyList(list):
def the_method(self):
# do some thing
return [1, 2]
inst = MyList()
print inst # [1, 2]
通常当我打印类的实例,我将获得“XXX在0x0000000002D92358对象”, 但如果我打印类的一个实例,它从名单继承,我会得到一个列表的输出,如何巨蟒做?
答
你需要教 python如何将你的类转换为字符串。
Python的基础对象有两种处理转换为字符串的方法:__repr__
和__str__
。为了得到你想要的结果,你需要重写它们。
这两个函数的用途相似但不完全相同。你可以找出它们之间的确切区别是here。通过Ned Batchelder给出一个很好的解释是:
我的经验法则:
__repr__
是开发人员,__str__
是客户。
在你的情况下,你不需要让它们与众不同。自定义列表类的明确表示也是最易读的,因此这两个函数可以返回相同的结果。
修改类,像这样:
class MyList(list):
def __repr__(self):
return str([1,2])
def __str__(self):
return self.__repr__()
注意,这两个函数必须返回一个字符串,因此在__repr__
return语句调用str
。
答
如果您覆盖__repr __(self)方法,则可以修改对象的表示形式。但它必须返回str类型。
>>> class MyList(list):
def do(self):
return [1, 2]
def __repr__(self):
return '[1, 2]'
>>> inst = MyList()
>>> inst
[1, 2]
关于__repr__
和__str__
之间的区别,这里有一个很好的解释https://*.com/a/2626364/840582
'list's有'__repr__'和'__str__'方法,即输出就是你看到的。 –