2013-11-02 85 views
1

在下面的兩個類中,Guitarist_1和Guitarist_2,它們的對象表示函數的字符串格式最爲pythonic;公認?我更喜歡Guitarist_1,因爲我不必列出;以任何特定的方式排序屬性。Python字符串格式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的情況下,你可以調用'格式'與解壓縮列表(這使得它與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')>