Как предотвратить присвоение атрибутов объекту, которые не были указаны в определении класса? - PullRequest
2 голосов
/ 11 марта 2020

Я определил простой класс. Удивительная вещь: я могу назначать атрибуты, которые не были определены в определении класса.

  1. Как это возможно?
  2. Как я могу предотвратить это?

Посмотрите, что я имею в виду, это мой простой класс:

class Dog:                             
    def __init__(self,name):                
        self.name=name

Конечно, теперь я могу создать экземпляр объекта: dog = Dog('Fido')

Печать Print(dog.name) дает 'Fido'.

Но теперь я просто могу назначить свой новые атрибуты объектной собаки, хотя я не включил их в определение класса.

Например: dog.mood="happy" работает. Когда я печатаю Print(dog.mood), я получаю 'happy', это значит, что это работает. Почему это возможно и как я могу предотвратить присвоение значений таким атрибутам, как "настроение", даже если я не определил их в своем определении класса собаки?

1 Ответ

1 голос
/ 16 марта 2020

По умолчанию пользовательский класс позволяет динамически назначать атрибуты. Один из способов предотвратить это - использовать __slots__ в вашем классе:

>>> 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'

__slots__ делает так, чтобы ваш экземпляр больше не носил __dict__ для своего пространства имен, которое было бы буквальным python dict объект. Это делает пользовательские объекты довольно раздутыми по умолчанию, так что это заставляет ваши объекты использовать меньше памяти, а также оптимизирует доступ к атрибутам (устраняя необходимость поиска на основе ha sh).

Здесь ссылка на некоторая документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...