851103895 发表于 2020-8-14 16:01:46

为什么显示不了初始化好的属性

class Rectangle():
    def __init__(self,length=0,width=0):
      self.length = length
      self.width=width
      self.square = 0
      
    def __setattr__(self,name,value):
      if name == 'square':
            self.length = value
            self.width= value
      else:
            super().__setattr__(name,value)
   

c.Rectangle()
c.square

显示不了c.square????

zltzlt 发表于 2020-8-14 16:02:23

应该是这样:

class Rectangle():
    def __init__(self,length=0,width=0):
      self.length = length
      self.width=width
      self.square = 0
      
    def __setattr__(self,name,value):
      if name == 'square':
            self.length = value
            self.width= value
      else:
            super().__setattr__(name,value)
   

c = Rectangle()    # 修改
print(c.square)    # 修改

851103895 发表于 2020-8-14 16:07:45

zltzlt 发表于 2020-8-14 16:02
应该是这样:

我设置了一个self.square1 = 0的初始化属性
然后运行
c.Rectangle()
c.square1   却可以显示该属性,而c.square就不行,说Rectangle没有该属性,父系没有该属性我可以理解啊,我访问子类的属性而已,关父类啥事

zltzlt 发表于 2020-8-14 16:09:03

851103895 发表于 2020-8-14 16:07
我设置了一个self.square1 = 0的初始化属性
然后运行
c.Rectangle()


因为你 __setattr__ 里面定义了当设置的实例属性名为 square 时,就设置自身的 length 和 width 属性

851103895 发表于 2020-8-14 16:12:08

zltzlt 发表于 2020-8-14 16:09
因为你 __setattr__ 里面定义了当设置的实例属性名为 square 时,就设置自身的 length 和 width 属性

哥,按您那个修改方式也是一样的错误耶。。。。。

zltzlt 发表于 2020-8-14 16:13:09

851103895 发表于 2020-8-14 16:12
哥,按您那个修改方式也是一样的错误耶。。。。。

那就这样:

class Rectangle():
    def __init__(self, length=0, width=0):
      self.length = length
      self.width = width
      self.square = 0

    def __setattr__(self, name, value):
      if name == 'square':
            self.length = value
            self.width = value
      else:
            super().__setattr__(name, value)


c = Rectangle()# 修改
print(c.length)
print(c.width)

zltzlt 发表于 2020-8-14 16:13:40

851103895 发表于 2020-8-14 16:12
哥,按您那个修改方式也是一样的错误耶。。。。。

这样可以:

class Rectangle():
    def __init__(self, length=0, width=0):
      self.length = length
      self.width = width
      self.square = 0

    def __setattr__(self, name, value):
      if name == 'square':
            self.length = value
            self.width = value
      else:
            super().__setattr__(name, value)


c = Rectangle()# 修改
print(c.length)
print(c.width)

851103895 发表于 2020-8-14 16:35:37

zltzlt 发表于 2020-8-14 16:09
因为你 __setattr__ 里面定义了当设置的实例属性名为 square 时,就设置自身的 length 和 width 属性

大哥我从小甲鱼的课后作业找到答案了,谢谢大哥
初学者重写属性魔法方法很容易陷入的一个误区就是木有“观前顾后”。
页: [1]
查看完整版本: 为什么显示不了初始化好的属性