Python 如何防止将属性指定给类定义中未指定的对象?
我定义了一个简单的类。令人惊讶的是:我可以分配类定义中没有定义的属性Python 如何防止将属性指定给类定义中未指定的对象?,python,python-3.x,class,object,Python,Python 3.x,Class,Object,我定义了一个简单的类。令人惊讶的是:我可以分配类定义中没有定义的属性 这怎么可能 我怎样才能防止这种情况发生 看这里,我的意思是,这是我的简单课程: class Dog: def __init__(self,name): self.name=name 当然,我现在可以实例化一个对象:dog=dog('Fido') 打印Print(dog.name)产生'Fido' 但是现在我可以给
class Dog:
def __init__(self,name):
self.name=name
当然,我现在可以实例化一个对象:dog=dog('Fido')
打印Print(dog.name)
产生'Fido'
但是现在我可以给我的对象狗分配新的属性,尽管我没有将它们包括在类定义中
例如:
dog.mood=“happy”
有效。当我打印print(dog.mood)
时,我得到了'happy'
,这意味着它可以工作。为什么这是可能的,我如何阻止将值分配给属性,例如“情绪”,即使我没有在我的狗的类定义中定义它们?默认情况下,用户定义的类允许您动态分配属性。防止这种情况发生的一种方法是在课堂上使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
:
>>> class Dog:
... __slots__ = ('name',)
... def __init__(self, name):
... self.name = name
...
>>> dog = Dog('Fido')
>>> print(dog.name)
Fido
>>> dog.mood = 'happy'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Dog' object has no attribute 'mood'
>>类狗:
... __插槽(名称)
... 定义初始化(self,name):
... self.name=名称
...
>>>狗=狗(“Fido”)
>>>打印(狗名)
菲多
>>>dog.mood='happy'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:“Dog”对象没有属性“mood”
\uuuuu slots\uuuuu
使您的实例不再为其名称空间携带\uuuuu dict\uuuuu
,这将是一个纯pythondict
对象。这使得用户定义的对象在默认情况下相当臃肿,因此这会减少对象使用的内存,并将优化属性访问(消除基于哈希的查找的需要)
这是指向的链接,您没有包含语言标签,请编辑问题并将其包含在内。我想这是python.thx的建议,是的,这是python…我对你的问题投赞成票,因为这是你的一个敏锐的观察,特别是对一个新的投稿人。斯科特,thx对于你的评论和你的赞成票,我感到受宠若惊:-)完美,非常有用-这正是我想要的,thx很多!!