Как вы делаете доступ хэш в Python? - PullRequest
2 голосов
/ 03 апреля 2011

Я знаю, что этот вопрос звучит очень просто. Но я не могу найти его с помощью Google. Я знаю, что есть словари, которые выглядят как

o = {
  'a': 'b'
}

и они доступны с o['a']. Но как называются те, к которым обращаются как o.a? Я знаю, что они существуют, потому что я использую библиотеку optparse, и она возвращает объект, доступный как этот.

Ответы [ 5 ]

2 голосов
/ 03 апреля 2011

Похоже, optparse имитирует интерфейс атрибута для скрытого dict, но есть стандартная библиотека, которая делает нечто похожее, если не совсем словарь: collections.namedtuple.Я не могу говорить с другими механизмами, представленными здесь.

2 голосов
/ 03 апреля 2011

Вы не можете получить доступ к диктофонам, используя '.'если вы не реализуете свой собственный тип dict, производя от dict и предоставляя доступ через '.'запись посредством реализации __getattribute__() API, который отвечает за выполнение доступа к стилю атрибутов.

См. http://docs.python.org/reference/datamodel.html#object.__getattribute__

1 голос
/ 03 апреля 2011

Вы можете получить доступ к переменным в качестве словаря в «новых классах стиля». Я думаю, что вы должны быть немного осторожны, хотя.

>>> class C(object): # python 2 code, inheriting from 'object' is automatic in 3
    a = 5
    def __init__(self):
        self.j = 90


>>> c = C()
>>> c.__dict__
{'j': 90}
>>> print c.j
90
>>> print c.a
5

обратите внимание, что 'j' появилось в словаре, а 'a' - нет. Похоже, что-то связано с тем, как они инициализируются. Я немного смущен этим поведением и не возражаю против объяснения от гуру: D

Edit:

Если немного больше поиграть, то очевидно, что они решили пойти по вышеописанному поведению (но это все же немного странно

>>> class C(object):
    a = 5
    def __init__(self):
        self.j = 90
        self.funct = range # assigning a variable to a function

>>> c = C()
>>> c.__dict__
{'j': 90, 'funct': <built-in function range>}

Я думаю, что он разделяет объект класса (который будет одинаковым для каждого класса) с новыми членами класса (такими, как инициированные внутри init ). Если я сейчас сделаю

>>> c.newvar = 234
>>> c.__dict__
{'j': 90, 'newvar': 234, 'funct': <built-in function range>}

Вы видите, что он строит словарь! Надеюсь, это поможет: D

0 голосов
/ 04 ноября 2011

__getattr__ - это метод, который вы хотите реализовать вместе с __setattr__.Вот очень упрощенный пример (без проверки ошибок и т. Д.), Который показывает объект, который обеспечивает доступ как в словарном, так и в атрибутном стиле:

Missing = object()

class AttrElem(object):
    def __init__(self, **kwds):
        self.items = kwds.copy()
    def __getitem__(self, name):
        result = self.items.get(name, Missing)
        if result is not Missing:
            return result
        raise KeyError("key %r not found" % name)
    def __setitem__(self, name, value):
        self.items[name] = value
    def __getattr__(self, name):
        result = self.items.get(name, Missing)
        if result is not Missing:
            return result
        raise AttributeError("attribute %r not found" % name)
    def __setattr__(self, name, value):
        if name == 'items':
            object.__setattr__(self, name, value)
        else:
            self.items[name] = value
    def __repr__(self):
        return 'AttrElem(%s)' % ', '.join(
                ["%s:%s" % (k, v) for k, v in self.items.items()]
                )

При использовании это выглядит так:*

Как видно из кода, __getitem__ и __getattr__ очень похожи, отличаются только тем исключением, которое возникает, когда цель не может быть найдена.

0 голосов
/ 03 апреля 2011

name.attribute - это доступ к объекту в Python, а не доступ к элементу

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