为什么显示不了初始化好的属性
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????
应该是这样:
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) # 修改 zltzlt 发表于 2020-8-14 16:02
应该是这样:
我设置了一个self.square1 = 0的初始化属性
然后运行
c.Rectangle()
c.square1 却可以显示该属性,而c.square就不行,说Rectangle没有该属性,父系没有该属性我可以理解啊,我访问子类的属性而已,关父类啥事 851103895 发表于 2020-8-14 16:07
我设置了一个self.square1 = 0的初始化属性
然后运行
c.Rectangle()
因为你 __setattr__ 里面定义了当设置的实例属性名为 square 时,就设置自身的 length 和 width 属性 zltzlt 发表于 2020-8-14 16:09
因为你 __setattr__ 里面定义了当设置的实例属性名为 square 时,就设置自身的 length 和 width 属性
哥,按您那个修改方式也是一样的错误耶。。。。。 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: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:09
因为你 __setattr__ 里面定义了当设置的实例属性名为 square 时,就设置自身的 length 和 width 属性
大哥我从小甲鱼的课后作业找到答案了,谢谢大哥
初学者重写属性魔法方法很容易陷入的一个误区就是木有“观前顾后”。
页:
[1]