如何在python中覆盖list get对象

时间:2017-08-14 11:07:18

标签: python list override

我想实现一个继承自内置类列表的类并覆盖一个方法,当我得到这个类的实例时,我可以返回一个自定义数据,是否可能?

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

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

通常当我打印一个类的实例时,我会在0x0000000002D92358'处获得xxx对象, 但是如果我打印一个继承自list的类的实例,我将获得一个列表输出,python如何做到这一点?

2 个答案:

答案 0 :(得分:1)

您需要教授 python如何将您的班级转换为字符串。

Python的基础对象有两种处理转换为字符串的方法:__repr____str__。为了获得您想要的结果,您需要覆盖它们。

这两个功能用于相似但不相同的目的。您可以找出它们之间的确切区别hereNed Batchelder给出的一个很好的解释是:

  

我的经验法则:__repr__适用于开发人员,__str__适用于客户。

但是,在你的情况下,你不需要让它们与众不同。自定义列表类的明确表示也是最易读的,因此这两个函数可以返回相同的结果。

像这样修改你的课程:

class MyList(list):
    def __repr__(self):
        return str([1,2])
    def __str__(self):
        return self.__repr__()

请注意,这两个函数都必须返回字符串,因此在str的return语句中调用__repr__

答案 1 :(得分:0)

如果覆盖 __ 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://stackoverflow.com/a/2626364/840582