dire che ho un semplice classe Foo
, che proviene da una libreria esterna, quindi non posso cambiare direttamente:impedire l'accesso a una variabile di istanza da sottoclasse, senza influire classe base
class Foo(object):
def __init__(self, x):
self.x = x
Voglio creare un sottoclasse Bar
e impedire che venga modificato da un'istanza di Bar
, ma utilizzare ancora il metodo nei metodi Bar
.
Ecco quello che ho provato, ed è probabilmente illuminare l'idea di base, ma purtroppo non funziona:
class Bar(Foo):
@property
def x(self):
return super().x
@x.setter
def x(self, value):
raise NotImplementedError('Do not change x directly, use "do_stuff()" instead')
def do_stuff(self, value):
if <something>:
super().x = value
Quindi, in pratica ho creato alcune funzioni wrapper (do_stuff()
) intorno un attributo, e ora voglio impedire che l'attributo venga modificato direttamente, poiché potrebbe rovinare alcune funzionalità delle funzioni wrapper. È possibile in modo ragionevole?
Modificato con un esempio migliore di ciò che voglio. Non sto cercando di impedire loro di vedere la variabile x
, ma invece cambiare dal di fuori di do_stuff()
Quindi non si desidera accedere direttamente alla variabile ma si desidera utilizzare nelle funzioni. L'ho capito correttamente? –
@udhy Sì, esattamente. Voglio impedire * ad altri * di accedere all'attributo dopo aver istanziato 'Bar'. Quindi quando qualcuno fa 'bar = Bar (4); bar.x = 5' genererà un errore e dirà loro di usare 'do_stuff()'. –
'Foo .__ init__' ha lo stesso accesso a' x' tutto ciò che fa. A meno che non si controlli esplicitamente * come * 'x' viene assegnato, ad es. con 'inspect', non vedo come puoi farlo. Siamo tutti adulti consenzienti, quindi bloccare le cose in questo modo non è realmente supportato. – jonrsharpe