Переменные разыменования при инициализации класса - PullRequest
3 голосов
/ 04 апреля 2011

Это мой код для инициализации словаря классов:

class Directory:
    def __init__(self, **kwds):
        self.__dict__.update(kwds)
obj = Directory(name=dict())

В приведенном выше случае ключ name, и к нему можно получить доступ с помощью: obj.__dict__.['name'] или obj.name

Q1.Как я могу инициализировать словарь классов со значением ключа, являющимся значением переменной?

Код должен выглядеть примерно так:

name = 'bin'
obj = Directory(name=dict()) #here I want the variable `name` to be replaced by its value i.e. `bin`

Q2. Есть ли другие оптимальные способы реализации класса?(может быть __slots__)

Спасибо!

1 Ответ

5 голосов
/ 04 апреля 2011

Правильно ли я считаю, что вы хотите иметь возможность вызывать конструктор с ключевыми словами-аргументами, но использовать значение переменной в качестве имени аргумента, а не само имя переменной?

Это невозможно сделать с таким точным синтаксисом, но вот пара других синтаксисов, которые вы можете использовать:

name = 'bin'
obj = Directory(**{name: dict()})

Если вы довольны этим синтаксисом, вы можете просто использовать его, не меняя класс (он просто будет работать).

Другой синтаксис, если вы хотите установить только одно значение:

name = 'bin'
obj = Directory(name, dict())

Если вы довольны этим синтаксисом, вы можете поддержать его, переписав класс следующим образом:

class Directory:
    def __init__(self, name, value):
        self.__dict__[name] = value

Для Q2, __slots__ это не то, что вы ищете. Это позволяет вам указать «все члены этого класса имеют одинаковые поля» (таким образом, избегая необходимости иметь словарь). У вас есть яркий пример того, как вы не можете использовать __slots__, потому что все экземпляры вашего класса могут иметь разных членов.

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