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
    ,这将是一个纯python
    dict
    对象。这使得用户定义的对象在默认情况下相当臃肿,因此这会减少对象使用的内存,并将优化属性访问(消除基于哈希的查找的需要)


    这是指向

    的链接,您没有包含语言标签,请编辑问题并将其包含在内。我想这是python.thx的建议,是的,这是python…我对你的问题投赞成票,因为这是你的一个敏锐的观察,特别是对一个新的投稿人。斯科特,thx对于你的评论和你的赞成票,我感到受宠若惊:-)完美,非常有用-这正是我想要的,thx很多!!