изменить атрибут экземпляра класса условно в python

#python #class #conditional-statements #instance

#python #класс #условные операторы #экземпляр

Вопрос:

Я новичок в python. У меня есть класс X, наследующий класс Y. В классе X атрибут b всегда остается постоянным и никогда не меняется, но в классе Y он должен меняться, когда выполняется заданное условие.

 class X(object):

   def __init__(self,others_attributes):
    
       self.b = 1
       self.others_attributes = others_attributes

class Y(X):

   def __init__(self,others_attributes,variable_condition):
        
        super(X, self).__init__(others_attributes)

    self.b  = 1
  

Как можно гарантировать, что на каждом шаге моделирования любой экземпляр класса Y будет иметь определенное значение атрибута b? Должен ли я создать @classmethod или @properties, похожие на что-то вроде приведенного ниже?
Или есть лучшая стратегия?

 if variable_condition:
    self.b = self.b   1
else:
    self.b = self.b

return self.b
  

Комментарии:

1. Вам не нужно self.b = self.b .

2. Спасибо @Barmar. Вы правы!

Ответ №1:

Не уверен, спрашиваете ли вы о поддержании состояния уровня класса или состояния уровня экземпляра.

Если вы спрашиваете о том, как изменить состояние уровня класса, все, что вам нужно сделать, это сохранить b как переменную класса:

 some_condition = True

class X(object):
    count = 0

class Y(X):
    def __init__(self):
        if some_condition:
            Y.count  = 1

instances = [
    X(),
    Y(),
    Y(),
    X(),
    X(),
    Y()
]

print('n'.join([str(i.count) for i in instances]))
  

Если вы хотите изменить b только для определенных экземпляров Y , вы можете сделать что-то вроде:

 class X(object):
    def __init__(self):
        self.b = 0

class Y(X):
    def __init__(self, some_condition):
        super(Y, self).__init__()
        if some_condition:
            self.b  = 1  # or set it to whatever else you want
        else:
            self.b = -1

instances = [
    X(),
    Y(True),
    Y(False),
    X(),
    X(),
    Y(True)
]

print('n'.join([str(i.b) for i in instances]))
  

Комментарии:

1. Спасибо @kingkupps Я хочу изменить b только для определенных экземпляров Y.

Ответ №2:

@kingkupps

учитывая, как показано ниже

 some_condition = True

class X(object):
    def __init__(self,a,c):
        self.b = 1
        self.a = a
        self.c = c

class Y(X):

   def __init__(self,a,c):

        super(X,self).__init__(a,c)

        def __init__(self, some_condition):
            super(Y, self).__init__()
            if some_condition:
               self.b  = 1  # or set it to whatever else you want
            else:
               self.b = -1
  

Файл «C:UsersAlexandreDocumentsPYTHONPaper_ICESPteste.py «, строка 248, в
ячейках ABM.myfun(a,c)

Файл «C:Usersmynamefirstfoldersecondfolderthirdfoldermyscript.py «, строка 132, в myfun c = Y(a,c)

Файл «C:Usersmynamefirstfoldersecondfolderthirdfoldermyscript.py «, строка 154, в init super(X,self).init(a,c)

Ошибка типа: object.init() принимает ровно один аргумент (экземпляр для инициализации)

Я подозреваю, что создание суперкласса Y внутри дочернего класса Y вмешивается в Y. Что вы думаете?