为何Python类实例可添加未定义属性?未触发属性不存在报错?
为什么Python类实例可以添加未定义的属性?
嘿,这其实是Python作为动态编程语言的核心特性之一——动态属性赋值,完全正常哦!
你遇到的情况是这样的:Python中的类实例默认允许在运行时动态添加新属性,不管这个属性有没有在类定义里提前声明。当你执行John_Smith.rank = 'Director'时,Python会自动在这个实例的__dict__字典中添加一个新的键值对('rank': 'Director'),后续访问这个属性时就会从这里读取值,所以不会报错还能正常输出结果。
为什么你的类里没声明也能加?
你的EmployeeClass类只定义了私有属性__status(实际被Python重命名为_EmployeeClass__status)和对应的get/set方法,但没有做任何限制实例添加新属性的操作。Python默认不会限制这种动态扩展行为,这也是它灵活性的体现。
如果想禁止动态添加属性怎么办?
要是你希望实例只能拥有类中提前定义的属性,可以在类中使用__slots__来限制。比如修改你的类:
class EmployeeClass(object): __slots__ = ('_EmployeeClass__status',) # 只允许这个私有属性 __status = None def __init__(self, status): self.__status = status def get_status(self): return self.__status def set_status(self, status): self.__status = status John_Smith = EmployeeClass("Employed") John_Smith.rank = 'Director' # 这里会抛出AttributeError: 'EmployeeClass' object has no attribute 'rank'
使用__slots__后,实例就不会再创建__dict__,只能拥有__slots__中列出的属性,无法动态添加新属性。
内容的提问来源于stack exchange,提问作者WhitneyChia
相关产品推荐
相关产品推荐

