Для начала, если вы думаете, что хотите @staticmethod
, вы почти всегда этого не делаете. Либо функция не является частью класса, и в этом случае она должна быть просто свободной функцией, либо она является частью класса, но не привязана к экземпляру, и она должна быть @classmethod
. Ваш названный конструктор является хорошим кандидатом на @classmethod
.
Также обратите внимание, что вы должны вызывать A.__init__
из B
через super()
, в противном случае множественное наследование может вас сильно укусить.
class A:
def __init__(self, data):
self.values_to_counts = {}
for val in data:
if val in self.values_to_counts:
self.values_to_counts[val] += 1
else:
self.values_to_counts[val] = 1
@classmethod
def from_values_to_counts(cls, values_to_counts):
self = cls([])
self.values_to_counts = values_to_counts
return self
class B(A):
def __init__(self, data, parameter):
super(B, self).__init__(data)
self.parameter = parameter
def print_parameter(self):
print self.parameter
В этом случае вам не нужен B.from_values_to_counts
, он наследуется от A
, и он вернет экземпляр B
, так как он был назван.
Если вам нужно выполнить более сложную инициализацию в B
, вы можете, используя super()
, что выглядит очень похоже на то, как если бы вы использовали его с экземплярами. в конце концов, classmethod
на самом деле не является чем-то более сложным, чем instancemethod
, где атрибут im_self
назначен самому классу.
class A:
def __init__(self, data):
self.values_to_counts = {}
for val in data:
if val in self.values_to_counts:
self.values_to_counts[val] += 1
else:
self.values_to_counts[val] = 1
@classmethod
def from_values_to_counts(cls, values_to_counts):
self = cls([])
self.values_to_counts = values_to_counts
return self
class B(A):
def __init__(self, data, parameter):
super(B, self).__init__(data)
self.parameter = parameter
def print_parameter(self):
print self.parameter
@classmethod
def from_values_to_counts(cls, values_to_counts):
self = super(B, cls).from_values_to_counts(values_to_counts)
do_more_initialization(self)
return self