Python编写Student类运行报AttributeError无name属性问题求助
错误原因
你代码中name/uci_name/semester均为实例属性,仅在实例化时绑定到单个Student实例上,不属于Student类本身的属性。你写的assert语句尝试直接从Student类获取对应属性,自然触发AttributeError,同时assert要求属性为property类型,你当前的代码也没有定义类层面的property对象。
修复方案
你需要将三个属性定义为类层面的property,常规写法采用@property装饰器实现,注意要把实例内部存储的属性名改为带_前缀的形式,避免和property重名触发无限递归:
class Student: def __init__(self, name, uci_name, semester): self._name = name self._uci_name = uci_name self._semester = semester @property def name(self) -> str: return self._name @property def uci_name(self) -> str: return self._uci_name @property def semester(self) -> int: return self._semester def __str__(self): return f"{self.name} [{self.uci_name}] in Semester {self.semester}" student_tom = Student("Tom", "tom55", 3) assert isinstance(getattr(Student, "name"), property) assert isinstance(getattr(Student, "uci_name"), property) assert isinstance(getattr(Student, "semester"), property)
如果你想保留原有get_开头的方法,也可以直接在类末尾用property()函数绑定:
class Student: def __init__(self, name, uci_name, semester): self._name = name self._uci_name = uci_name self._semester = semester def get_name(self) -> str: return self._name def get_uci_name(self) -> str: return self._uci_name def get_semester(self) -> int: return self._semester # 直接在类层面定义property name = property(get_name) uci_name = property(get_uci_name) semester = property(get_semester) def __str__(self): return f"{self.name} [{self.uci_name}] in Semester {self.semester}"
以上两种写法都可以通过你给出的assert校验。
内容的提问来源于stack exchange,提问作者mayn
相关产品推荐
相关产品推荐

