需求:
1. 写一个矩形类,默认有宽和高两个属性;
2. 如果为一个叫square的属性赋值,那么说明这是一个正方形,值就是正方形的边长,此时宽和高都应该等于边长。
# -*- coding: utf-8 -*-
class Rectangle:
def __init__(self,length=0, width=0):
self.length=length
self.width=width
def __setattr__(self, key, value):
if key=="square":
self.width=value
self.length=value
else:
self.key=value
def getArea(self):
print ("矩形面积为:%.2f" %(self.length*self.width))
r=Rectangle(4.5,7.6)
r.getArea()
File “E:/Python Program/test.py”, line 15, in setattr
self.key=value
File “E:/Python Program/test.py”, line 15, in setattr
self.key=value
RecursionError: maximum recursion depth exceeded
陷入了递归循环,原因是:
程序进行init(self,length=0, width=0)时,自动触发setattr(self, key, value)操作。此时,由于r=Rectangle(4.5,7.6),则key!=”square”,则又执行赋值语句self.key=value,无限递归。
修改方法:
super().__setattr__(name,value)
或者:
self.__dict__[name]=value
-- coding: utf-8 --
class Rectangle:
def init(self,length=0, width=0):
self.length=length
self.width=width
def __setattr__(self, key, value):
if key=="square":
self.width=value
self.length=value
else:
super().__setattr__(key,value)
#或者
# self.__dict__[key]=value
def getArea(self):
print ("矩形面积为:%.2f" %(self.length*self.width))
r=Rectangle(4.5,7.6)
r.getArea()
r.square=10
print (r.length)
print (r.width)
r.getArea()
print (r.dict)
结果为:
矩形面积为:34.20
10
10
矩形面积为:100.00
{‘width’: 10, ‘length’: 10}