__repr __,_ _ ttr__缺乏理解

时间:2018-06-13 14:32:52

标签: python string class repr

我现在正在研究Python课程并遇到一本书并没有解释的东西。

我有一个代码:

class Human(object):
    def __init__(self,*args,**kwargs):
        self.first_name = kwargs.setdefault('first')
        self.last_name = kwargs.setdefault('last')
        self.height = kwargs.setdefault('height')
        self.weight = kwargs.setdefault('weight')

def bmi(self):
    return self.weight/float(self.height)**2
Human.bmi = bmi

def human_str(self):
    return '{} {}'.format(self.first_name, self.last_name)
Human.__str__ = human_str

me = Human(first='Seth', last='Gibson')   
adam_mechtley = Human(first='Adam', last='Mechtley', weight = 78, height = 1.85) 
sis = Human(first='Ruth',last='Gibson')
babysis = Human(first='Emily',last='Gibson')
print(sis)
#Prints : proper name
print(sis,babysis)
#Prints : <place in memory>

我完全理解发生了什么,但是 问题是,为什么当我只打印一个实例时, str ()属性有效,但如果我尝试同时打印两个实例, repr ()属性为被使用?

谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

原因是在Python 2中,print(a,b)不会打印ab,但会打印(a, b),即tuple。因此,print(a)会调用str(a)(...)不会将单个元素转换为元组),而print(a,b)会调用__str__元组(a, b),后者又调用各个元素的__repr__。 (如果没有定义__repr__,则默认情况下会打印类型和内存地址。)

最小例子:

class Test:
    def __str__(self):
        return "str"
    def __repr__(self):
        return "repr"

t = Test()
print(t)
print(t, t)

使用Python 2输出:

str
(repr, repr)

另一方面,在Python 3上,或者在Python 2中执行print t, t时,如果没有(...)print将直接在两个元素上调用str。< / p>

str
str str

此外,与问题无关,我建议您将Human类更改为此类,定义正确的方法而不使用kwargs

class Human(object):
    def __init__(self, first, last, height=None, weight=None):
        self.first_name = first
        self.last_name = last
        self.height = height
        self.weight = weight

    def bmi(self):
        return self.weight/float(self.height)**2

    def __str__(self):
        return '{} {}'.format(self.first_name, self.last_name)

答案 1 :(得分:1)

这是定义您之前编写的类的更常用方法

class Human(object): 
    def __init__(self,*args,**kwargs):
        self.first_name = kwargs.setdefault('first')
        self.last_name = kwargs.setdefault('last')
        self.height = kwargs.setdefault('height')
        self.weight = kwargs.setdefault('weight') 
    def bmi(self):
        return self.weight/float(self.height)**2
    def __str__(self):
        return '{0} {1}'.format(self.first_name, self.last_name)

你的问题的其余部分可能在这里回答: Difference between __str__ and __repr__?