Я пытаюсь создать статический метод, фабричный метод создания объектов для группы классов с помощью метапрограммирования.Вот что я пробовал до сих пор:
class PlayMeta(type):
def __new__(cls, clsname, bases, dct):
newclass = super(PlayMeta, cls).__new__(cls, clsname, bases, dct)
@staticmethod
def make():
print('meta make')
setattr(newclass, make.__name__, make)
return newclass
class Fritz(PlayMeta):
pass
Fritz.make()
, но когда я запускаю его, я получаю:
AttributeError: type object 'Fritz' has no attribute 'make'
Как вы это делаете?У меня есть сообщения с большим количеством полей, и я хочу, чтобы это был класс, который будет создавать и генерировать разные из этих сообщений.Этот вопрос о фабрике / создании части.Я использую Python 3.5.Спасибо!
правка: 2-я, рабочая версия:
class PlayMeta(type):
def __new__(cls, clsname, bases, dct):
newclass = super(PlayMeta, cls).__new__(cls, clsname, bases, dct)
def instance_method(self, x, y, z):
print('instance method', x, y, z)
setattr(newclass, instance_method.__name__, instance_method)
def static_make(x, y, z):
print('static make', x, y, z)
setattr(newclass, static_make.__name__, static_make)
return newclass
class Fritz(metaclass=PlayMeta):
pass
Fritz.static_make('a', [], 3)
f = Fritz()
f.instance_method('a', [], 3)
Успешно печатает:
static make a [] 3
instance method a [] 3
Как Python отличает метод экземпляра от метода класса / статики,когда они определены и прикреплены одинаково?Наличие слова «я»?Потому что это было бы удобно, но немного нелепо.
edit2: Ах, это, вероятно, только в том, как это называется - вызывайте его с экземпляром, и все хорошо с методом, ожидающим экземпляр.Но вы можете вызвать любой метод, с экземпляром или без него, и они будут вести себя правильно или нет, соответственно.
edit3, окончательная форма :):
@staticmethod
def static_make(x, y, z):
print('static make', x, y, z)
setattr(newclass, 'static_make', static_make)
Я не знаю, что (в) staticmethod добавляет - версия 2, выше, сработало - но это больше самодокументируетсяпо крайней мере.