Почему нам разрешено динамически добавлять атрибуты в класс в Python?

В Python мы можем динамически добавлять атрибуты к объекту (классу), например:

class Foo(object):
    pass

foo = Foo()
foo.a = 10

Мой вопрос может быть немного теоретическим. Итак, это удобно. Но почему мы должны использовать эту функцию??? Есть ли конкретная ситуация, когда этот подход будет предпочтительнее? Что насчет инкапсуляции?


person user35603    schedule 12.02.2019    source источник
comment
1 слово, метапрограммирование. Напишите код, который изменяет ваш код во время выполнения. Представьте, что вы можете написать filter_tablename_by_columnname, и он автоматически сгенерирует эту функцию, когда вы ее вызовете, захватив все, что вы написали вместо имени таблицы и столбца, и используя их напрямую. Это очень ОЧЕНЬ мощно.   -  person Prodigle    schedule 12.02.2019


Ответы (1)


Одним словом: Гибкость. В качестве примера я использовал динамические свойства, когда мне нужно было передать данные с объектами GUI методу, который обрабатывает прикрепленное к ним событие. Я уверен, что есть десятки других применений.

Тем не менее, если вы относитесь к тому типу людей, которым нравится иметь принудительные атрибуты и не разрешать динамически добавлять новые, вы можете это сделать. Я могу представить себе несколько мест, где это может быть полезно, например, помогает убедиться, что вы не устанавливаете неправильное значение (опечатку) в своем коде. Что-то вроде самопроверки.

Чтобы ограничить/предотвратить добавление динамических значений, вы можете добавить в класс свойство __slots__, как показано в примере ниже.

class Foo(object):
    __slots__ = ['val', 'val2']
    pass

foo = Foo()
foo.val = 10

print(foo.val)

foo.b = 5 # throws exception
print(foo.b) 
person Dave    schedule 12.02.2019