【问题标题】:__repr__, __str__ lack of understanding__repr__, __str__ 缺乏理解
【发布时间】:2018-11-23 04:34:33
【问题描述】:

我现在正在学习 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() 属性是正在使用?

感谢您的宝贵时间!

【问题讨论】:

  • 这肯定是定义类的倒退方式
  • 如果这是 Python 3,我会说 print(x) 使用 __str__,而 print((x,y)) 调用 tuple__str__,内部调用元素的 __repr__,但它不会在 Python 2 中打印 (...),即不是元组。可能还是那样。
  • 无法复制。当我在 Python 2.7.10 中运行此代码时,我得到 Ruth Gibson&lt;newline&gt;Ruth Gibson Emily Gibson 作为输出。
  • 实际上,经过仔细检查,我也无法重现问题,使用Python 2.7.15rc1,既不是这种“向后”方式,也不是正确的def __str__(self),也不是str和@ 987654333@.
  • 对不起,伙计们犯了一个小错误,而不是 'print sis' 和 'print sis,babysis',应该是 'print(sis)' 和 'print(sis,babysis)'。很抱歉造成混淆,括号不见了。那么我的问题就有意义了。

标签: python string class repr


【解决方案1】:

原因是在 Python 2 中,print(a,b) 不会打印 ab,但会打印 (a, b),即 tuple。因此,print(a) 将调用str(a)(...) 不会将单个元素组成一个元组),而print(a,b) 调用元组__str____str__,而后者又调用@987654332 @ 的各个元素。 (如果没有定义__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

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)

【讨论】:

    【解决方案2】:

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

    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__?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多