Python 格式化self,这是一个字典

Python 格式化self,这是一个字典,python,python-3.x,Python,Python 3.x,在这种情况下,如何使格式(self)起作用 class Commit: number = None sha = None message = None identity = None def __init__(self, raw, number): r = raw.commits[number] self.number = number self.sha = r['sha'] self.m

在这种情况下,如何使
格式(self)
起作用

class Commit:
    number = None
    sha = None
    message = None
    identity = None

    def __init__(self, raw, number):
        r = raw.commits[number]

        self.number = number
        self.sha = r['sha']
        self.message = r['message']
        self.identity = raw.identities[r['identity']]

    def __str__(self):
        return """
Commit {number} {sha}
Message {message}
Identity {identity}
""".format(self)

    def __getitem__(self, attr):
        return getattr(self, attr)
    def __contains__(self, attr):
        return hasattr(self, attr)
如果我尝试访问单个属性作为

c = Commit(raw, 170)
print(c['sha'])
例如,它是有效的。但是,如果我直接打印(c),它会说:

KeyError:“数字”

我希望
format()
能够通过
\uuu getitem\uuuu()
获取它所需的属性


如何使其工作?

不,您必须使用
**self
并支持更多映射方法

但是,您最好使用对属性访问的格式支持:

    def __str__(self):
        return """
Commit {0.number} {0.sha}
Message {0.message}
Identity {0.identity}
""".format(self)

现在,它将使用属性访问从第一个位置参数到
.format()
,即
self
查找
number
message
,等等。您有一个
self.number
,但想访问一个
self['number']
。这是明显的


试试
{0.number}
而不是…

如果
identity
是一本字典,我想把某些元素放进去怎么办?这不起作用:
Identity:{0.Identity['author\u name']}
format()
不理解引号,请尝试
{0.Identity[author\u name]}
@Flavius:仔细阅读;您不需要使用引号。:-)