我是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”方法是什么?你知道吗
1)子类化列表并在其中只包含CoinAmount类型的元素是一种好的、更干净的方法
2)是的,可以这样做。您可以继承python
list
并重写append
方法来检查类型。 这里有一个很好的例子:Overriding append method after inheriting from a Python List3)一个好的实践就是扩展
list
并放置您的定制。你知道吗继承-当不用于类型时-通常是一种非常受限的组合/委托形式,因此从
list
继承是一种糟糕的设计。你知道吗拥有一些
CoinContainer
类将委托给list
是一个更好的设计,因为1/它可以让您完全控制API,2/它可以让您根据需要更改实现(您可能会发现list
并不是满足您需求的最佳容器)。你知道吗此外,由于您不必确保重写所有
list
方法和magicmethods,只重写您需要的方法(cf point#1),因此实现起来更容易。你知道吗wrt/type cheking,它通常不被认为是pythonic的-客户机代码负责确保它只传递兼容的对象。如果您真的想在这里进行一些类型检查,那么至少使用ABC并对这个ABC进行测试,而不是对固定类型进行测试。你知道吗
相关问题 更多 >
编程相关推荐