Rozważmy następujący kod:Dodaj atrybut do klasy Pythona
class Foo():
pass
Foo.entries = dict()
a = Foo()
a.entries['1'] = 1
b = Foo()
b.entries['3'] = 3
print(a.entries)
To będzie druk:
{'1': 1, '3': 3}
dlatego, że wpisy są dodawane jako atrybutu statycznego. Czy istnieje sposób, w jaki małpa łata definicję klasy, aby dodać nowe atrybuty (bez dziedziczenia).
udało mi się znaleźć w następujący sposób, ale wygląda zawiłe do mnie:
def patch_me(target, field, value):
def func(self):
if not hasattr(self, '__' + field):
setattr(self, '__' + field, value())
return getattr(self, '__' + field)
setattr(target, field, property(func))
patch_me(Foo, 'entries', dict)
Dodajesz atrybut * class *, który jest wspólny dla wszystkich instancji. Jeśli dodasz go do instancji, czy instancje * już utworzone * uzyskają nowy atrybut? – jonrsharpe
Dlaczego nie możesz zamiast tego użyć 'a.entries = {'1': 1}? – Vincent