Я бы хотел изменить полосу переменной класса класса 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