Есть ли "стандартный" базовый класс в Python? - PullRequest
1 голос
/ 16 марта 2012

Я ищу способ создания базового "объекта" Python, которому я могу назначать внешние атрибуты.
В настоящее время я делаю это следующим образом:

Я определяю пустой класс с помощью

class C(object):
    pass

и затем я создаю экземпляр объекта и присваиваю атрибуты следующим образом:

c = C()
c.attr = 2

Приходя к моему вопросу

Есть ли способ создания экземпляра пустого объекта класса,затем я могу назначить атрибуты, как показано выше, без определения class C?

Может быть, есть какой-то другой лучший способ добиться того, чего я добиваюсь?

Ответы [ 3 ]

6 голосов
/ 16 марта 2012

Похоже, вы ищете гибкий контейнер, который не имеет методов и может принимать атрибуты с произвольными именами.Это dict.

d = dict()
d['myattr'] = 42

Если вы предпочитаете синтаксис атрибута, который вы получаете с классом (c.myattr = 42), тогда используйте класс так же, как и в коде в вашем вопросе.

4 голосов
/ 16 марта 2012

Есть ли способ создания экземпляра пустого объекта класса, который затем я могу назначить атрибутам, как показано выше, без определения класса C?

Да:

>>> C = type("C", (object,), {})
>>> c = C()
>>> c.attr = 2

Но, как вы видите, это не так уж много улучшений, и конечный результат тот же - это просто еще один способ создания того же класса C.

Добавление:

Вы можете сделать его красивее, «спрятав» его в функции:

def attr_holder(cls=type("C", (object,), {})):
    return cls()

c = attr_holder()
c.attr = 2

Хотя это всего лишь изобретение колеса - замените двухстрочную функцию на

class attr_holder(object):
    pass

и это будет работать точно так же, и мы прошли полный круг.Итак: следуйте советам Дэвида или Реоркса.

2 голосов
/ 16 марта 2012

Я давно пришел к тому же вопросу, а затем создал этот класс для использования во многих моих проектах:

class DotDict(dict):
    """
    retrieve value of dict in dot style
    """
    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError('has no attribute %s' % key)

    def __setattr__(self, key, value):
        self[key] = value

    def __delattr__(self, key):
        try:
            del self[key]
        except KeyError:
            raise AttributeError(key)

    def __str__(self):
        return '<DotDict %s >' % self.__to_dict()

    def __to_dict(self):
        return dict(self)

Когда я хочу, чтобы объект хранил данные или хотел легко извлечь значение из dict, я всегда использую этот класс.

Кроме того, он может помочь мне сериализовать атрибуты, которые я установил в объекте, и, при необходимости, получить исходные данные.

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

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