@classmethod для перегрузки конструктора

1

Обычно я использую 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

Теперь у меня есть два вопроса:

  • Возможно ли, чтобы @classmethod не разделил переменные класса?
  • Как правильно использовать @classmethod для перегрузки конструктора?
  • 3
    Что b даже для , здесь? Вы устанавливаете это на классе, cls , поэтому не должно быть удивительно, что это является общим, но почему вы устанавливаете это вообще? Вы хотели вместо этого сделать return cls(b) ? Или установите его для экземпляров через __init__ и return cls(10, b) если он не должен использоваться совместно.
  • 1
    Если вы хотите назначить атрибут b каждому экземпляру, используя from_const , возможно, вы хотите инициализировать экземпляр, а затем назначить ему b. Вот идея: @classmethod def from_const(cls, b=30): instance = cls(10) instance.b = b return instance
Показать ещё 5 комментариев
Теги:
python-3.x
constructor
class-method

1 ответ

1
Лучший ответ

Возможно, вы хотите сначала запустить экземпляр, а затем присвоить ему 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню