Python创建带tuple类型position属性的Square类出现AttributeError问题
报错原因及修复方案
核心错误点
- 私有属性
__position未初始化就尝试访问:初始化时执行self.position = position触发setter方法,setter中直接操作self.__position[0],但此时__position属性还未创建,直接抛出属性不存在的异常。 - 误用tuple可变性:Python中tuple是不可变数据类型,不支持修改内部元素,即使
__position已初始化,直接对self.__position[0]赋值也会抛出类型错误。 - 校验逻辑不全:当前position的setter没有校验输入是否为长度为2的整数元组,传入非tuple类型、长度不符的序列都会触发异常。
- 代码缩进错误:你提供的代码中类定义下的所有方法、文档字符串都没有正确缩进,Python语法要求类成员必须相对于类定义缩进4个空格。
修复后完整代码
class Square: ''' create Square instance with public attributes size and position ''' def __init__(self, size=0, position=(0, 0)): self.size = size self.position = position ''' retrieve size and make it private''' @property def size(self): return self.__size ''' set private size attribute ''' @size.setter def size(self, value): if type(value) is not int: raise TypeError("size must be an integer") if value < 0: raise ValueError("size must be >= 0") self.__size = value ''' retrieve position and make it private ''' @property def position(self): return self.__position ''' set private position attribute ''' @position.setter def position(self, value): # 补全position校验逻辑 if not isinstance(value, tuple) or len(value) != 2: raise TypeError("position must be a tuple of 2 positive integers") if not isinstance(value[0], int) or not isinstance(value[1], int): raise TypeError("position must be a tuple of 2 positive integers") if value[0] < 0 or value[1] < 0: raise TypeError("position must be a tuple of 2 positive integers") # 直接给私有属性赋值整个元组,不要修改单个元素 self.__position = value ''' calculates area of square ''' def area(self): return self.__size ** 2 ''' print a square of # the size of self.__size''' def my_print(self): if self.__size == 0: print() else: for line in range(self.__position[1]): print() for i in range(self.__size): print(" " * self.__position[0], end="") print("#" * self.__size)
内容的提问来源于stack exchange,提问作者seahorse-code
相关产品推荐
相关产品推荐

