Я бы хотел изменить полосу переменной класса класса, чтобы создание объекта было выполнено с помощью Bar2 вместо bar1
class A(object):
def __new__(cls, foo):
obj = super(A, cls).__new__(cls)
return obj
У меня нет доступа к классу A. Класс A поступает из стороннего пакета, который не имеет __init __ , но он требуется как Аргумент __new __ function.
class B(A):
bar = "bar1"
def __new__(cls, foo=bar):
print("actual",foo)
rm = super().__new__(cls,foo=foo)
return rm
< /code>
Еще одна часть головоломки заключается в том, что в дополнение к B есть длинная стопка детских классов, которые наследуют от B, и я не хочу модифицировать все их init для передачи переменной Foo до класса A.
Я хочу запустить следующий код (потому что с точки зрения пользователя легко выбрать значение «Бар» и потому что Модификации кода очень мало. < /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