3

format(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'])

例如,它有效。但是,如果我print(c)直接说:

键错误:“数字”

我本来希望format()通过__getitem__().

如何让它发挥作用?

4

2 回答 2

8

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

但是,最好使用属性访问的格式支持来代替:

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

现在它将使用属性访问从第一个位置参数到number,即.message.format()self

于 2012-12-18T12:39:40.380 回答
3

您有一个self.number,但想要访问一个self['number']. 这是与众不同的...

换一个试试{0.number}...

于 2012-12-18T12:40:24.613 回答