Python类成员访问权限

时间:2019-05-22 16:28:43

标签: python list operator-overloading subclass

我是python的新手,正在尝试学习它。有人可以帮我一个简单的问题吗?我正在创建一个对象,如下所示:

 def myList(list):

    def __repr__(self):
    return list.__repr__(self)

因此,基本上只是一个列表。但是随后在输入列表之后,我想将其值加倍。即

当我使用

 t = myList([1, 2, 3])
 print(t)

它应该输出[2, 4 ,6]

现在我知道如何将列表中的每个元素加倍,例如可以使用

 l = [x * 2 for x in l]

但是我不确定如何在创建后立即访问myList对象的成员并将它们加倍。

1 个答案:

答案 0 :(得分:5)

您需要覆盖__init__来执行输入的转换,然后再将其传递到list的{​​{1}},例如带有列表理解或生成器表达式:

__init__

生成器表达式的版本为class myList(list): def __init__(self, it=()): super().__init__([x * 2 for x in it]) def __repr__(self): return list.__repr__(self) ;这样可以避免可能会产生较大的临时super().__init__(x * 2 for x in it),但这通常会使其运行速度变慢。

旁注:您完全不需要在此处覆盖list;您会自动从__repr__继承它,因此也可以完全忽略该定义。仅当您要显示加倍,但要存储原始值(在这种情况下,您想要)时,才可以覆盖它:

list

编辑:由于OP请求了一种初始化class myList(list): def __repr__(self): return repr([x * 2 for x in self]) 的方法,然后将值加倍,因此您可以立即调用myList的初始化程序,然后在之后listmyList仍未完全初始化,直到myList返回,并且速度会变慢,但这会将底层的__init__初始化与加倍分隔开来:

list