python - 将单个元素列表视为 Python 中的标量
问题描述
¿ 是否可以定义一个 python 列表的子类,它允许使用单元素列表变量,就好像它们是标量一样?
例如,我希望能够做到:
class CustomList(list):
...
...
list1 = CustomList([2])
list2 = CustomList([3])
list3 = CustomList([4,5,6])
list4 = CustomList([{'foo':'bar'}])
list1 #should return list1[0]
list4['foo'] #should return list4[0]['foo'] = 'bar'
list1 + list2 #should return list1[0] + list2[0] = 5
但保持正常使用列表的能力:
for i in list3:
print list[i]
解决方案
是的,但是您实际上需要覆盖您希望它使用的任何方法。
当您在列表等对象上调用某些运算符时,您最终会在这些对象上调用隐藏方法。在您给出的示例中result = list1 + list2
,实际调用的函数是list1.__add__(list2)
。如果需要,您可以继承list
和覆盖这些方法。例如:
class CustomList(list):
def __add__(self, value):
if len(self) == 1 and len(value) == 1:
return self[0] + value[0]
else:
return CustomList(list.__add__(self, value))
如果它们的长度都为 1,则将list1
和视为标量,否则将引用正常功能。这个关于子类化的stackoverflow答案可能对您有所帮助。list2
list
list
为了解决您的编辑问题,一个更通用的解决方案将相当简单 -__add__()
尝试覆盖函数,而不是覆盖函数,__getitem__()
每当您使用方括号运算符时都会调用它:
class CustomList(list):
def __getitem__(self, y):
if len(self) == 1:
return self[0][y]
else:
return self[y]
但是,这可能会在尝试连接数组时引起问题;list3 + list1
会导致错误,因为list1
它不是可迭代的,当然__add__
如果列表长度超过一个元素,您可以覆盖以简单地将第二个值添加为列表元素。
使用上述声明的控制台输出:
>>> list1 = CustomList([2])
>>> list2 = CustomList([3])
>>> list3 = CustomList([4,5,6])
>>> print(list1 + list2)
5
>>> print(list2 + list3)
[3, 4, 5, 6]
推荐阅读
- javascript - 下载 javascript 包后,expo 在我的 android 手机上退出
- python - AttributeError:类型对象“点”没有属性“方向”
- php - 不确定在白盒测试中要准确测试什么,是每个功能吗?
- mysql - 连接表中父级的 MySQL 查询
- javascript - React 中是否有类似“本地”组件上下文的东西?
- node.js - 如何更改 Discord.js 中的 Int 值?
- class - 生成修改类参数的 URL
- mongodb - 是否有任何解决方案可以在 Vercel 中为无服务器功能重用数据库连接
- node.js - Snowflake nodejs 驱动程序返回无法连接:网络错误。无法到达雪花
- android - 如何将受保护的 egl 表面渲染到 android 手机的外部屏幕