pythonic方法在类Person中打印变量

时间:2016-11-20 13:41:19

标签: python oop

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显示这些变量?

当我在课堂上有34个变量

时,我不想要意大利面条代码

3 个答案:

答案 0 :(得分:0)

不确定它是否更Pythonic,但不是定义show,而是可以覆盖__repr__(您需要return该字符串而不是打印它。然后,您可以只调用person_obj.show而不是调用print(person_obj)

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]

答案 1 :(得分: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)

一般情况下,它与您的情况相同,只是更明确一些。

答案 2 :(得分: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)