Python字符串格式args与kwargs

时间:2013-11-02 23:41:25

标签: python string class format arguments

在下面的两个类中,Guitarist_1和Guitarist_2,其中一个对象表示函数的字符串格式最为pythonic;公认?我更喜欢Guitarist_1,因为我不需要列出;以任何特定方式订购物业。

[Guitarist_1] Hendrix, Jimi (11/27/1942)
[Guitarist_2] Hendrix, Jimi (11/27/1942)

Guitarist.py

import re

class Guitarist(object):
    CLASS_NAME_RE = r'([A-Z][\w\d_]+)\'>$'
    def __init__(self, fname, lname, dob):
        self.fname, self.lname, self.dob = fname, lname, dob
    def className(self):
        return re.search(self.CLASS_NAME_RE, str(type(self))).group(1)
    def __repr__(self):
        return '[{}]'.format(self.className())

class Guitarist_1(Guitarist):
    def __init__(self, fname, lname, dob):
        Guitarist.__init__(self, fname, lname, dob)
    def __repr__(self):
        return Guitarist.__repr__(self) + ' {lname}, {fname} ({dob})'\
        .format(**self.__dict__)


class Guitarist_2(Guitarist):
    def __init__(self, fname, lname, dob):
        Guitarist.__init__(self, fname, lname, dob)
    def __repr__(self):
        return Guitarist.__repr__(self) + ' {}, {} ({})'\
        .format(self.lname, self.fname, self.dob)

print Guitarist_1('Jimi', 'Hendrix', '11/27/1942')
print Guitarist_2('Jimi', 'Hendrix', '11/27/1942')

1 个答案:

答案 0 :(得分:2)

如果订单不重要,那么简化且功能多样的版本将是:

class Guitarist(object):

    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        return "<{0}('{1}')>".format(self.__class__.__name__, 
                                     "', '".join(self.__dict__.values()))

if __name__ == '__main__':
    print(Guitarist(fname='Jimi', lname='Hendrix', dob='11/27/1942'))

<Guitarist('Jimi', 'Hendrix', '11/27/1942')>