如何覆盖python中的列表获取对象

问题描述:

我想实现一个从内置类列表继承的类并重写一个方法,当我得到这个类的一个实例时,我可以返回一个自定义数据,这有可能吗?如何覆盖python中的列表获取对象

class MyList(list): 
    def the_method(self): 
     # do some thing 
     return [1, 2] 

inst = MyList() 
print inst # [1, 2] 

通常当我打印类的实例,我将获得“XXX在0x0000000002D92358对象”, 但如果我打印类的一个实例,它从名单继承,我会得到一个列表的输出,如何巨蟒做?

+3

'list's有'__repr__'和'__str__'方法,即输出就是你看到的。 –

你需要 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

+0

但我也想获得一个自定义列表(realt-ime从数据库),当我尝试到达变量mylist(mylist = MyList())时,我可以做到吗? – nopa

+0

@nopa你问过关于获取字符串表示。你现在问的是完全不相关的。你应该接受这个问题的答案,然后问一个新问题,并清楚描述你的新问题。然后,具有所需知识的人会帮助你。 – stybl

+0

也许我还没有确定我真的需要什么样的设计,不管怎么样,谢谢你的回复 – nopa

如果您覆盖__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

+0

但是我也想在试图到达变量mylist(mylist = MyList())时获得一个自定义列表(realt-ime从数据库) ), 我可以做吗? – nopa

+0

听起来像你需要用列表对象定义一个类,而不是扩展它 – Vinny