Обычно я использую isinstance
для перегрузки конструктора, но люди также предлагают @classmethod
для того же самого. Но, насколько мне известно, @classmethod
разделяет переменную.
Ниже приведен простой класс
class abc:
def __init__(self, a=0):
self.a = a
@classmethod
def from_const(cls, b=30):
cls.b = b
return cls(10)
def printme(self):
print(self.a,self.b)
Теперь давайте сделаем три объекта
a1 = abc(a=100)
a2 = abc.from_const(b=31)
a3 = abc.from_const(b=41)
a4 = abc().from_const(b=51)
a5 = abc().from_const(b=61)
a1.printme()
a2.printme()
a3.printme()
a4.printme()
a5.printme()
Выход:
100 61
10 61
10 61
10 61
10 61
Теперь у меня есть два вопроса:
Возможно, вы хотите сначала запустить экземпляр, а затем присвоить ему b
внутри своего класса.
Здесь идея:
class abc:
def __init__(self, a=0):
self.a = a
self.b = None
@classmethod
def from_const(cls, b=30):
instance = cls(10)
instance.b = b
return instance
def printme(self):
print(self.a,self.b)
a1 = abc(a=100)
a2 = abc.from_const(b=31)
a3 = abc.from_const(b=41)
a4 = abc.from_const(b=51)
a5 = abc.from_const(b=61)
Выход:
(100, None)
(10, 31)
(10, 41)
(10, 51)
(10, 61)
b
даже для , здесь? Вы устанавливаете это на классе,cls
, поэтому не должно быть удивительно, что это является общим, но почему вы устанавливаете это вообще? Вы хотели вместо этого сделатьreturn cls(b)
? Или установите его для экземпляров через__init__
иreturn cls(10, b)
если он не должен использоваться совместно.from_const
, возможно, вы хотите инициализировать экземпляр, а затем назначить ему b. Вот идея:@classmethod def from_const(cls, b=30): instance = cls(10) instance.b = b return instance