Защо ни е позволено да добавяме атрибути към клас динамично в Python?

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

class Foo(object):
    pass

foo = Foo()
foo.a = 10

Въпросът ми може да е малко теоретичен. Така че е удобно. Но защо трябва да използваме тази функция??? Има ли някаква конкретна ситуация, когато този подход ще бъде за предпочитане? Какво ще кажете за капсулирането?


person user35603    schedule 12.02.2019    source източник
comment
1 дума, метапрограмиране. Напишете код, който променя кода ви по време на изпълнение. Представете си, че можете да напишете filter_tablename_by_columnname и той автоматично генерира тази функция, както я наричате, грабвайки каквото сте написали на мястото на tablename и 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