Вот очень простой пример того, что я пытаюсь обойти:
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()
Класс фактически не существует, пока он определяется. Принцип работы оператора 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 = {}
Вы можете добавить атрибут some_dict после определения основного класса.
class Test(object):
pass
Test.some_dict = {Test: True}
Вы также можете использовать метакласс (здесь функция, но есть и другие способы):
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