Я пытаюсь изменить методы setattr и getattr в моем классе, но у меня возникает ошибка, когда я пытаюсь определить оба из них.
class Basee:
def __init__(self, app):
self.app = app
self.x = 3
def test(self):
return self.x
def __getattr__(self, item):
if item in dir(self):
return getattr(self, item)
elif item in dir(self.app):
return getattr(self.app, item)
else:
if item in self.__dict__:
return self.__dict__[item]
else:
return self.app.__dict__[item]
class App:
def __init__(self, y):
self.y = y
def test2(self):
return self.y
app = App(5)
test = Basee(app)
Над кодом только с getattr работает нормально.
class Basee:
def __init__(self, app):
self.app = app
self.x = 3
def test(self):
return self.x
def __getattr__(self, item):
if item in dir(self):
return getattr(self, item)
elif item in dir(self.app):
return getattr(self.app, item)
else:
if item in self.__dict__:
return self.__dict__[item]
else:
return self.app.__dict__[item]
def __setattr__(self, key, value):
if key in self.__dict__:
return self.__setattr__(key, value)
else:
return self.app.__setattr__(key, value)
class App:
def __init__(self, y):
self.y = y
def test2(self):
return self.y
app = App(5)
test = Basee(app)
Над кодом с обоими методами повышение и ошибка:
Traceback (most recent call last):
File "C:\Program Files\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in
run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-41-5e27f0c3b3cf>", line 8, in <module>
test = Basee(app)
File "<ipython-input-40-eff8d695cb0e>", line 3, in __init__
self.app = app
File "<ipython-input-40-eff8d695cb0e>", line 24, in __setattr__
return self.app.__setattr__(key, value)
File "<ipython-input-40-eff8d695cb0e>", line 12, in __getattr__
elif item in dir(self.app):
File "<ipython-input-40-eff8d695cb0e>", line 12, in __getattr__
elif item in dir(self.app):
File "<ipython-input-40-eff8d695cb0e>", line 12, in __getattr__
elif item in dir(self.app):
[Previous line repeated 1486 more times]
File "<ipython-input-40-eff8d695cb0e>", line 10, in __getattr__
if item in dir(self):
RecursionError: maximum recursion depth exceeded while calling a Python object
Как я могу это починить? Я хочу получить и установить все методы и атрибуты классов Base и App, ссылаясь на базовый класс, например, написав: test.y = 7 должен измениться в коде backgorund self.app.y на 7, а затем при попытке получить тест .yi может видеть 7, и это относится к self.app.y :-) Есть идеи?