Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类型的集合_Python_Python 3.x_Collections - Fatal编程技术网

Python类型的集合

Python类型的集合,python,python-3.x,collections,Python,Python 3.x,Collections,我是python新手(使用python 3.6) 我有一个类,表示一些虚构硬币的数量 因此,一个实例可以表示10个蓝色硬币或负和,比如-20个红色硬币等等 我现在可以在一个列表中保存几个这样的CoinAmounts。 e、 g 我想通过对每种类型的硬币求和来“压缩”上面的列表,这样我就有了 [CoinAmount(coin='blue',amount=10), CoinAmount(coin='green',amount=5)] 或 从中很容易得出前者 我的问题是: 1) 让某种listofc

我是python新手(使用python 3.6)

我有一个类,表示一些虚构硬币的数量

因此,一个实例可以表示10个蓝色硬币或负和,比如-20个红色硬币等等

我现在可以在一个列表中保存几个这样的
CoinAmount
s。 e、 g

我想通过对每种类型的硬币求和来“压缩”上面的列表,这样我就有了

[CoinAmount(coin='blue',amount=10), CoinAmount(coin='green',amount=5)]

从中很容易得出前者

我的问题是:

1) 让某种
listofcainamounts
子类化list并添加compress方法有意义吗?或者我应该使用这样一个CoinAmountUtils类,它有一个静态方法来处理列表并对其进行压缩

2) 是否有办法确保该列表实际上只包含
CoinAmounts
,还是应该假设并遵循这一点(或者两者兼而有之,即可以这样做,但不应该这样做)

3) 从更一般的角度来看,处理“特定事物列表”的最佳实践“pythonic”方法是什么?

1)子类化列表并在其中仅包含CoinAmount类型的元素是一种良好且更干净的方法

2) 是的,可以做到。您可以继承python
list
并重写
append
方法来检查类型。 这里有一个很好的例子:


3) 一个好的做法是扩展
列表并放置自定义项。

继承-当不用于键入时-通常是一种非常受限的组合/委派形式,因此从
列表继承是一种糟糕的设计

有一些
CoinContainer
类委托给
列表
是一个更好的设计,因为1/它可以让您完全控制API,2/它可以让您根据需要更改实现(您可能会发现
列表
不是满足您需求的最佳容器)

此外,由于您不必确保覆盖所有
列表
方法和magicmethods,只覆盖您需要的方法和magicmethods,因此实现起来更容易(参见第1点)


wrt/type cheking,它通常不被认为是pythonic的-客户机代码负责确保它只传递兼容的对象。如果您真的想在这里进行一些类型检查,那么至少要针对这个ABC使用and测试,而不是针对固定类型

您不需要包含静态方法的“utils”类。它们可以只是函数。听起来你的
CoinAmount
s列表应该像
{'red':0,'blue':10,'green':5}
@Rawing。。。除非秩序是重要的,这两种方式都不明显。或者,除非列表以未压缩和压缩的形式出现。对我来说,这里有趣的一点是一种有效的求和方法,如果列表很大并且有很多颜色……谢谢@Rawing,虽然这在某些场景中可能是一种很好的方法,但它与我的实际用例无关,因为我的实际用例比上面描述的更复杂。@khelwood,谢谢。你显然是对的,这是其他编程语言旧习惯的直接结果。我不同意打字部分。在某些静态类型语言中,这可能被视为一种“良好实践”,但在Python中则不太常见,因为子类化几乎只用于实现,而不用于类型。@Brunodesshuilliers您建议如何确保列表中相同类型的元素,即
CoinAmounts
?请共享。只需记录此代码需要
CoinAmount
或任何兼容的东西(任何具有相同API的东西)。令人惊讶的是,它工作得如此之好,而不仅仅是对于一次性脚本。实际上,在现有的Python代码库(当然是Python的stdlib,但也包括所有主要的Python库、框架和应用程序)中,很少有类型检查。@DhruvPathak在提供的链接中,您指的是哪一个示例?这难道不意味着我必须将我想在这里使用的列表的每一个功能都委派给他人吗?继承时,我将免费获得所有这些功能(无代码),只需处理我实际需要修改的功能(如果有)?是的,是的-但根据经验,您必须覆盖几乎所有这些功能,因此至少您可以完全控制api和实现。。。
[CoinAmount(coin='blue',amount=10), CoinAmount(coin='green',amount=5)]
[CoinAmount(coin='blue',amount=10), CoinAmount(coin='red',amount=0), CoinAmount(coin='green',amount=5)]