很多时候,我发现自己编码一些琐碎的数据类型,例如
class Pruefer:
def __init__(self, ident, maxNum=float('inf'), name=""):
self.ident = ident
self.maxNum = maxNum
self.name = name
虽然这非常有用(很明显,我不想用匿名的三元组代替上面的内容),但它也非常简单。
现在,例如,当我想在字典中使用该类时,我必须添加更多样板
def __hash__(self):
return hash(self.ident, self.maxNum, self.name)
我承认在所有样板类(class)中可能很难识别一个通用模式,但是尽管如此,我还是想提一个问题:
python中流行的习惯用法,以使用命名访问器派生快速而肮脏的数据类型?
最佳答案
>>> from collections import namedtuple
>>> Pruefer = namedtuple("Pruefer", "ident maxNum name")
>>> pr = Pruefer(1,2,3)
>>> pr.ident
1
>>> pr.maxNum
2
>>> pr.name
3
>>> hash(pr)
2528502973977326415
要提供默认值,您需要做更多的事情...简单的解决方案是使用
__new__
方法的重定义编写子类:>>> class Pruefer(namedtuple("Pruefer", "ident maxNum name")):
... def __new__(cls, ident, maxNum=float('inf'), name=""):
... return super(Pruefer, cls).__new__(cls, ident, maxNum, name)
...
>>> Pruefer(1)
Pruefer(ident=1, maxNum=inf, name='')