2016-11-20 79 views
0
class Person: 
def __init__(self, name, surname, age): 
    self.name = name 
    self.surname = surname 
    self.age = age 

def show(self): 
    print(("Name: {}\nSurname: {}\nAge: {}").format(self.name, self.surname, self.age)) 

是否有更多pythonic的方式來顯示這些變量的功能show?pythonic方式打印變量類人

我不想意大利麪條代碼時,我有34類變量

+2

的可能的複製[打印Python類的所有屬性(http://stackoverflow.com/questions/5969806/print-all-properties-of-a-python-class) – dbf

+0

你想打印你班級的所有屬性嗎? –

+0

create'__str __()'方法 – furas

回答

0

不知道這是更Python或沒有,但不是定義show可以覆蓋__repr__(你需要return該字符串代替打印它)。然後,您可以簡單地執行print(person_obj)而不是調用person_obj.show

class Person: 
    def __init__(self, name, surname, age): 
     self.name = name 
     self.surname = surname 
     self.age = age 

    def __repr__(self): 
     return "Name: {}\nSurname: {}\nAge: {}").format(self.name,  self.surname, self.age) 

print(Person('a','b', 'c')) 
>> Name: a 
    Surname: b 
    Age: c 

這將正確顯示,即使你有人員名單:

print([Person('a', 'b', 'c'), Person('d', 'e', 'f')]) 
>> [Name: a 
    Surname: b 
    Age: c, Name: d 
    Surname: e 
    Age: f] 
+0

它不是'__repr__'它的__str__','__repr__'用於技術信息,'__str__' - 用於向用戶顯示數據,所以在這種情況下,他應該重寫'__str__' – wasd

+0

@wasd如果覆蓋'str',那麼當它們是集合的一部分時,對象仍然顯示爲<處的對象。這可能或不可能是OP想要/需要的。 – DeepSpace

+0

那麼,它沒有具體說明它的實際用途,如果他的方法被稱爲調試不顯示,我可能會同意你的看法,但爲了表示的目的,使用'__str__'而不是'__repr__ ' – wasd

0

在這種情況下你不希望重寫__str__和急需show打印,不返回數據,這是更使用format pythonic。我會爲你的代碼做一些調整:

def show(self): 
    person_info = "Name {name}\nSurname {surname}\nAge {age}".format(name=self.name, surname=self.surname, age=self.age) 
    print (person_info) 

一般情況下,它是一樣的,只是更明確一點。

0

您可以利用類的內部__dict__屬性來避免輸入兩次所有變量。此外,最好使用__repr__功能爲代表類

class Person(object): 
    def __init__(self, name, surname, age): 
     self.name = name 
     self.surname = surname 
     self.age = age 

    def __repr__(self): 
     return '\n'.join([ 
      'Name: {name}', 
      'Surname: {surname}', 
      'Age: {age}' 
     ]).format(**self.__dict__) 


john = Person('John', 'Doe', 42) 
print(john) 

抽象的另一個步驟,你可以採取以避免硬編碼格式字符串以創建標識的實例,並使用屬性的列表它們如下:

class Person(object): 
    _identifiers = ('name', 'surname', 'age') 

    def __init__(self, name, surname, age): 
     self.name = name 
     self.surname = surname 
     self.age = age 

    def __repr__(self): 
     return '\n'.join(
      '{k}: {v}'.format(k=key.capitalize(), v=self.__dict__[key]) 
      for key in self._identifiers 
     ) 


john = Person('John', 'Doe', 42) 
print(john)