yccjm2001 发表于 2023-3-24 11:27:09

求教各位大佬,调用的方式是如何锚定?


求教各位大佬,调用的方式是如何锚定?

class C:
    def __init__(self,data):
      self.data = data
    def __str__(self):
      return f"data = {self.data}"
    def __repr__(self):
      return f"C({self.data})"
    def __add__(self,other):
      self.data += other

      
c = C(250)
print(c)                               #为什么直接打印会调用__str__()
data = 250
c                                    #为什么直接访问会调用__repr__()
C(250)
c+250                           #为会么+号会调用__add__()
print(c)
data = 500
c
C(500)


            














isdkz 发表于 2023-3-24 11:42:02

首先来解释一下这个类的几个方法的作用:

1、__init__ 是构造方法,用于初始化对象。
2、__str__ 是用于返回对象的字符串表示,通常用于描述性输出。
3、__repr__ 是用于返回对象的官方字符串表示,通常用于调试和开发。
4、__add__ 是用于定义对象的加法操作。
现在来解答你的问题:

当你使用 print(c) 时,由于 print 函数会将对象转换为字符串,所以会调用 __str__ 方法。

当你直接在交互式环境中输入变量名(如 c),解释器会尝试显示变量的官方字符串表示。在这种情况下,它会调用 __repr__ 方法。

当你执行 c + 250 时,由于 C 类定义了 __add__ 方法,所以解释器会调用这个方法来处理加法操作。在这个例子中,__add__ 方法会将 other 的值(即 250)加到 self.data 上。

最后,print(c) 的输出和第一次输出的原因相同,是因为调用了 __str__ 方法。但这次由于 __add__ 方法的调用,c.data 的值已经被修改为 500,因此输出为 data = 500。

同样地,直接访问 c 会调用 __repr__ 方法,输出为 C(500)。
页: [1]
查看完整版本: 求教各位大佬,调用的方式是如何锚定?