Почему нам разрешено динамически добавлять атрибуты в класс в Python? - PullRequest
0 голосов
/ 12 февраля 2019

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

class Foo(object):
    pass

foo = Foo()
foo.a = 10

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

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Одним словом: гибкость.Я использовал динамические свойства при необходимости передавать данные с объектами 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) 
0 голосов
/ 12 февраля 2019

Согласно https://rosettacode.org/wiki/Add_a_variable_to_a_class_instance_at_runtime:

Это полезно, когда методы / переменные экземпляра основаны на файле данных, который недоступен до времени выполнения.Хэл Фултон приводит пример создания OO CSV-парсера в упражнении по метапрограммированию с Ruby.Pythonistas и некоторые другие называют это «monkeypatching».

Я использовал эту функцию, когда впервые попробовал алгоритм больших данных, который работает во всех БД, вы не знаете свойства каждой таблицы, но, используя этовам не нужно знать, я думаю, что это все

...