2013-11-02 4 views
1

Из 2-х классов ниже, Guitarist_1 и Guitarist_2, который представляет собой строковый формат функции представления объектов, наиболее pythonic; принято? Я предпочитаю Guitarist_1, потому что мне не нужно перечислять; заказывайте свойства любым способом.Python String Format args vs kwargs

[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') 
+0

В случае Guitarist_2 вы могли бы назвать 'format' с распакованным списком (что делает его примерно таким же, как Guitarist_1) , Строка формата предназначена для заказа материала. – kren470

+2

Этот вопрос может найти лучший дом на http://codereview.stackexchange.com/ – SethMMorton

+1

FYI: 'className' может быть упрощен, чтобы' return self .__ class __.__ name__'. (Кроме того, '__init__' в производных классах не нужны, если все, что они делают, передают свои аргументы в '__init__' суперкласса.) – jwodder

ответ

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')> 
Смежные вопросы