класс __ init __ (не экземпляр __ init __)

Вот очень простой пример того, что я пытаюсь обойти:

class Test(object):
    some_dict = {Test: True}

Проблема состоит в том, что я не могу относиться для Тестирования, в то время как это все еще определяется

Обычно, я просто сделал бы это:

class Test(object):
    some_dict = {}
    def __init__(self):
        if self.__class__.some_dict == {}:
            self.__class__.some_dict = {Test: True}

Но я никогда не создаю экземпляр этого класса. Это - действительно просто контейнер для содержания группы связанных функций и данных (у меня есть несколько из этих классов, и я раздаю ссылки на них, таким образом, необходимо для Теста быть своим собственным классом),

Таким образом, мой вопрос, как я мог относиться для Тестирования, в то время как он определяется, или действительно ли там что-то подобно __init__ это добирается, звонил, как только класс определяется? Если возможно, я хочу self.some_dict = {Test: True} оставаться в определении класса. Это - единственный способ, которым я знаю, как сделать это до сих пор:

class Test(object):
    @classmethod
    def class_init(cls):
        cls.some_dict = {Test: True}
Test.class_init()
8
задан Ponkadoodle 24 April 2010 в 22:32
поделиться

3 ответа

Класс фактически не существует, пока он определяется. Принцип работы оператора class заключается в том, что тело оператора выполняется как блок кода в отдельном пространстве имен. В конце выполнения это пространство имен передается метаклассу (например, type ), и метакласс создает класс, используя пространство имен в качестве пространства атрибутов.

Судя по вашему описанию, не кажется необходимым для того, чтобы Test был классом. Похоже, это должен быть модуль . some_dict является глобальным - даже если это атрибут класса, в вашей программе есть только один такой атрибут, так что это не лучше, чем иметь глобальный - и любые методы класса, которые у вас есть в классе, могут быть просто функции.

Если вы действительно хотите, чтобы это был класс, у вас есть три варианта: установить dict после определения класса:

class Test:
    some_dict = {}
Test.some_dict[Test] = True

Использовать декоратор класса (в Python 2.6 или новее):

def set_some_dict(cls):
    cls.some_dict[cls] = True

@set_some_dict
class Test:
    some_dict = {}

Или использовать метакласс:

class SomeDictSetterType(type):
    def __init__(self, name, bases, attrs):
        self.some_dict[self] = True
        super(SomeDictSetterType, self).__init__(name, bases, attrs)

class Test(object):
    __metaclass__ = SomeDictSetterType
    some_dict = {}
12
ответ дан 5 December 2019 в 10:01
поделиться

Вы можете добавить атрибут some_dict после определения основного класса.

class Test(object):
  pass
Test.some_dict = {Test: True}
4
ответ дан 5 December 2019 в 10:01
поделиться

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

def Meta(name, bases, ns):
    klass = type(name, bases, ns)
    setattr(klass, 'some_dict', { klass: True })
    return klass

class Test(object):
    __metaclass__ = Meta

print Test.some_dict
0
ответ дан 5 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: