很多时候,我发现自己编码一些琐碎的数据类型,例如

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中流行的习惯用法,以使用命名访问器派生快速而肮脏的数据类型?
  • 或者如果没有的话,也许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='')
    

    10-06 00:29