#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. Что вы думаете?