Изменение переменной класса перед __new__Python

Программы на Python
Anonymous
 Изменение переменной класса перед __new__

Сообщение Anonymous »

Я бы хотел изменить полосу переменной класса класса B, чтобы создание объекта класса A было выполнено с помощью Bar2 вместо bar1 (где bar1 < /code> - по умолчанию). Это облегчает пользователю выбрать, хотят ли он создать класс B с параметрами bar1 или bar2 при использовании класса. Я не против других способов (например, метод), чтобы изменить его. Я просто хочу, чтобы пользователь мог сделать это до создания класса.class A(object):
def __new__(cls, foo):
obj = super(A, cls).__new__(cls)
return obj

У меня нет доступа к классу A. Класс A поступает из стороннего пакета, который не имеет __init __ , но он требуется как Аргумент функции __new __ .
класс B:
class B(A):

bar = "bar1"

def __new__(cls, foo=bar):
print("actual",foo)
rm = super().__new__(cls,foo=foo)
return rm

класс B - это производственный класс, который наследует от класса A. Поскольку я хочу изменить параметр Foo в классе A, мне нужно перезаписать __new __ .
Еще одна часть головоломки заключается в том, что в дополнение к B есть длинная стопка детских классов, которые наследуют от B, и я не хочу изменять все их init < /strong > Чтобы пройти переменную Foo до класса A. < /p>
Я хочу запустить следующий код (потому что с точки зрения пользователя легко выбрать значение «Бар» и потому что модификации на Код очень мало. < /p>
if __name__ == '__main__':

B.bar = 'bar2'
b = B()
print(b.bar)
< /code>
Я получаю: < /p>
actual bar1
bar2
< /code>
, тогда как я ожидаю: < /p>
actual bar2
bar2
< /code>
Я изменил свой пример, чтобы он работал, но это не красиво, и я ищу более питоническое решение. Это использует переменную полоса класса в качестве массива и использует методы класса для ее изменения < /p>
class A(object):

def __new__(cls, foo):
obj = super(A, cls).__new__(cls)
return obj

class B(A):

_bar_array = ["bar1"]

@classmethod
def set_bar(cls, value):
cls._bar_array[0] = value

@classmethod
def get_bar(cls):
return cls._bar_array[0]

def __new__(cls, foo=_bar_array):
print("actual",foo[0])
rm = super().__new__(cls,foo=foo[0])
return rm

if __name__ == '__main__':

B.set_bar("bar2")
b = B()
print(b.get_bar())
print(B.get_bar())


Подробнее здесь: https://stackoverflow.com/questions/793 ... before-new

Вернуться в «Python»