我现在正在研究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 ()属性为被使用?
谢谢你的时间!
答案 0 :(得分:2)
原因是在Python 2中,print(a,b)
不会打印a
和b
,但会打印(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__?