Я пишу класс с несколькими конструкторами, используя @classmethod
. Теперь я хотел бы, чтобы и конструктор __init__
, и конструктор classmethod вызывали некоторую процедуру класса для установки начальных значений перед тем, как делать другие вещи.Mutliple конструкторы в python, вызывающие ту же самую процедуру
От __init__
это обычно делается с самим собой:
def __init__(self, name="", revision=None):
self._init_attributes()
def _init_attributes(self):
self.test = "hello"
Из конструктора classmethod, я бы назвал еще classmethod вместо этого, так как экземпляр (т.е. self
) не создается, пока я не оставляю Метод класса с return cls(...)
. Теперь, я могу назвать мой _init_attributes()
метод как
@classmethod
def from_file(cls, filename=None)
cls._init_attributes()
# do other stuff like reading from file
return cls()
и это на самом деле работает (в том смысле, что я не получаю сообщение об ошибке, и я могу реально увидеть атрибут тест после выполнения c = Class.from_file()
. Тем не менее, если я понимаю вещи правильно, тогда это будет устанавливать атрибуты на уровне класса, а не на уровне экземпляра. Следовательно, если я инициализирую атрибут с изменяемым объектом (например, список), тогда все экземпляры этого класса будут использовать один и тот же список, а не их собственный список экземпляров. Правильно ли это? Если да, существует ли способ инициализировать атрибуты «instance» в методах класса или мне нужно написать код таким образом, чтобы вся инициализация атрибута выполнялась в init?
Хммм. Собственно, при написании этого: у меня может быть даже больше проблем, чем я думал, потому что init будет вызван по возвращении из класса, не так ли? Итак, каков был бы правильный способ справиться с этой ситуацией?
Примечание: Статья [1] обсуждает несколько схожую проблему.
Вместо этого вы не могли бы просто создать '_init_attributes()' a '@ staticmethod' и явно передать ему объект, чьи атрибуты необходимо инициализировать? – martineau