__str__和__repr__

'''__str__'''
class Foo_1:
   pass

f = Foo_1()
print(f) # <__main__.Foo_1 object at 0x0000020783813D30> ---> 系统默认__str__ --->相当于执行str(f)--->f.__str__()


class Foo:
   def __str__(self):
      return '自定制的对象的显示方式'

f1 = Foo()
print(f1) # 自定制的对象的显示方式 ---> 自定制__str__


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

   def __str__(self):
      return '名字是%s 年龄是%s' % (self.name, self.age)

f2 = Message('alex', 18)
print(f2) # 名字是alex 年龄是18 ---> 自定制__str__


'''repr()内置函数'''
# repr() 函数将对象转化为供解释器读取的形式
s = 'alex'
print(repr(s)) # 在终端能够看到输出结果为"'alex'"
d = {'name': 'lhf', 'age': 18}
print(repr(d)) # 在终端能够看到输出结果为"{'name': 'lhf', 'age': 18}"


'''__repr__'''
class Cat:
   def __init__(self, name):
      self.name = name

   def __repr__(self):
      return '名字是%s' % self.name

c = Cat('alex')
c # 在终端中,输入一个实例对象c显示的就是__repr__返回的内容
print(c)  # 名字是alex


'''__str和__repr之间的区别'''
class Dog:
   def __init__(self, name):
      self.name = name

   def __str__(self):
      return '来自str'

   def __repr__(self):
      return '来自repr'

d1 = Dog('alex')
print(d1)
# 当__str__和__repr__同时存在时,执行的是__str__;也就是说print(d1)相当于执行的是str(d1)--->d1.__str__();
# 当只有__repr__存在时,print依旧是先找str(d1)--->d1.__str__(),找不到就执行__repr__;__repr__在终端可以不调用print,直接输入实例对象即可显示返回内容
# 注意:这两方法的返回值必须是字符串,否则抛出异常
while True: print('studying...')
原文地址:https://www.cnblogs.com/xuewei95/p/14718065.html