Я написал рабочую программу для этого указанного упрощенного класса Mesh, но я не могу заставить ее работать для реального класса с десятками методов / свойств.
Я не могу изменить настоящий класс Mesh, и я не могу сделать класс Object расширенным Mesh.
Это прекрасно работает:
class Mesh:
def __init__(self):
self.hide_render = False
class Object:
def __init__(self, mesh_):
self.mesh = mesh_
def __getattr__(self, item):
return self.mesh.__getattribute__(item) # infinite loop in this line
def __setattr__(self, name, value):
if name == 'hide_render': # line to replace----------
self.mesh.__setattr__(name, value)
else:
super().__setattr__(name, value)
ob = Object(Mesh())
print(ob.hide_render)
print(ob.mesh.hide_render)
ob.mesh.hide_render = True
print(ob.hide_render)
print(ob.mesh.hide_render)
ob.hide_render = False
print(ob.hide_render)
print(ob.mesh.hide_render)
Выход:
False
False
True
True
False
False
Но когда я хочу сделать то же самое для реального класса Mesh, имеет гораздо больше, чем атрибут hide _render, заменив первую строку в setattr методе на:
if name not in self.__dict__:
или же
if name in self.mesh.__dict__:
Я получаю бесконечный цикл в методе getattr .
Зачем? И как это решить?