use*_*986 0 python list operator-overloading subclass
我是python的新手,正在尝试学习它。有人可以帮我一个简单的问题吗?我正在创建一个对象,如下所示:
def myList(list):
def __repr__(self):
return list.__repr__(self)
Run Code Online (Sandbox Code Playgroud)
所以基本上只是一个列表。但是然后在输入列表之后,我想立即将其值加倍。即
当我使用
t = myList([1, 2, 3])
print(t)
Run Code Online (Sandbox Code Playgroud)
它应该输出 [2, 4 ,6]
现在我知道如何将列表中的每个元素加倍,例如可以使用
l = [x * 2 for x in l]
Run Code Online (Sandbox Code Playgroud)
但是我不确定如何在创建后立即访问myList对象的成员并将它们加倍。
您需要重写__init__以执行输入的转换,然后再将其传递到list的__init__,例如使用列表推导或生成器表达式:
class myList(list):
def __init__(self, it=()):
super().__init__([x * 2 for x in it])
def __repr__(self):
return list.__repr__(self)
Run Code Online (Sandbox Code Playgroud)
生成器表达式的版本应为super().__init__(x * 2 for x in it); 它避免了潜在的大临时事件list,但通常会变慢一些。
旁注:您完全不需要__repr__在此处覆盖;您可以list自动继承它,因此也可以完全忽略该定义。仅当您要显示双倍但要存储原始值时才覆盖它才有意义:
class myList(list):
def __repr__(self):
return repr([x * 2 for x in self])
Run Code Online (Sandbox Code Playgroud)
编辑:由于OP请求了一种初始化方法myList,然后将值加倍,因此可以list立即调用的初始化方法,然后在myList之后进行加倍操作。myList直到__init__返回仍然没有完全初始化,并且速度会变慢,但这将基础list初始化与加倍分离开来:
class myList(list):
def __init__(self, it=()):
super().__init__(it) # Perform list initialization with original values
# Cycle through values and double each one
for i, x in enumerate(self):
self[i] = x * 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |