You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:39:03