Вы не можете вызывать classmethod
в определении class
, потому что класс еще не определен полностью, поэтому нет ничего, чтобы передать метод в качестве его первого аргумента cls
... классического цыпленка- и-яйца. Однако вы можете обойти это ограничение, перегрузив метод __new__()
в метаклассе и вызывая метод класса оттуда после создания класса, как показано ниже:
class Test(object):
# nested metaclass definition
class __metaclass__(type):
def __new__(mcl, classname, bases, classdict):
cls = type.__new__(mcl, classname, bases, classdict) # creates class
cls.static_init() # call the classmethod
return cls
x = None
@classmethod
def static_init(cls): # called by metaclass when class is defined
print("Hello")
cls.x = 10
print Test.x
Выход:
Hello
10