Python类型的集合

2024-03-29 04:51:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手(使用python3.6)。你知道吗

我有一个类,代表一些虚构的硬币的数量。你知道吗

所以一个例子可以表示10个蓝币或者负和,比如-20个红币等等。你知道吗

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

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

我想通过对每种硬币求和来“压缩”上面的列表,这样我就有了。你知道吗

[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)]

从中很容易得出前者。。。你知道吗

我的问题是:

1)让某种ListOfCoinAmounts子类列出并添加压缩方法有意义吗?或者我应该使用这样一个CoinAmountUtils类,它有一个静态方法可以处理列表并对其进行压缩?你知道吗

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

3)一般来说,处理“特定事物列表”的最佳实践“pythonic”方法是什么?你知道吗


Tags: 方法列表数量代表硬币greenbluered
2条回答

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

2)是的,可以这样做。您可以继承python list并重写append方法来检查类型。 这里有一个很好的例子:Overriding append method after inheriting from a Python List

3)一个好的实践就是扩展list并放置您的定制。你知道吗

继承-当不用于类型时-通常是一种非常受限的组合/委托形式,因此从list继承是一种糟糕的设计。你知道吗

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

此外,由于您不必确保重写所有list方法和magicmethods,只重写您需要的方法(cf point#1),因此实现起来更容易。你知道吗

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

相关问题 更多 >