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

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

Сообщение Anonymous »

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

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