Non so se ho un buon design qui, ma ho una classe derivata da unittest.TestCase e il modo in cui io averlo impostato, il mio codice inserirà dinamicamente un gruppo di metodi test_*
nella classe prima di richiamare l'unittest per eseguirlo. Io uso setattr
per questo. Questo ha funzionato bene, ma ora ho una situazione in cui voglio rimuovere i metodi precedentemente iniettati e iniettare una nuova serie di metodi. Come posso rimuovere tutti i metodi in una classe i cui nomi corrispondono al modello test_*
?Python - come posso rimuovere dinamicamente un metodo da una classe - cioè opposto di setattr
5
A
risposta
14
Si chiama delattr
ed è documentato here.
3
>>> class Foo:
def func(self):
pass
...
>>> dir(Foo)
['__doc__', '__module__', 'func']
>>> del Foo.func
>>> dir(Foo)
['__doc__', '__module__']
1
delattr()
è quello che vuoi. Passare attraverso vars()
della classe e verificare i nomi degli attributi che iniziano con "test_"
. Per esempio,
@classmethod
def remove_test_methods(cls):
for name in list(vars(cls)):
if name.startswith("test_") and callable(getattr(cls, name)):
delattr(cls, name)
vorrei consigliare di non usare dir()
, in quanto questo vi mostrerà i nomi dei tuoi classi genitore e, in modo non tutti i nomi che si ottiene da dir()
possono definita sulla classe che stai targeting.
0
In aggiunta alle risposte precedenti: se il metodo da cancellare è re-implementato, che avrebbe dovuto eliminare i metodi della classe sottoclasse e genitori, entrambi:
class A:
def method(self):
print("TestA")
class B(A):
def method(self):
A.method(self)
print("TestB")
instance = B()
instance.method() # will call B.method()
del B.method
instance.method() # will now call A.method()
del A.method
instance.method() # will now raise AttributeError
(o usare delattr
di @ Risposta di BrenBarn)
Problemi correlati
- 1. Python: Come chiamare un metodo di istanza da un metodo di classe della stessa classe
- 2. Come aggiungere dinamicamente un metodo di classe?
- 3. Come rimuovere una classe CSS da un componente Wicket?
- 4. Come chiamare un metodo python da una classe java?
- 5. Come posso creare dinamicamente classi derivate da una classe base
- 6. Equivalente rubino di python setattr()
- 7. Come posso definire dinamicamente un metodo alias per un metodo di classe?
- 8. aggiungere metodo a una classe dinamicamente con decoratore
- 9. come creare dinamicamente variabile di classe in Python
- 10. Importare dinamicamente un metodo in un file, da una stringa
- 11. `oggetto .__ setattr __ (self, ..., ...)` invece di `setattr (self, ..., ...)`?
- 12. Come posso chiamare dinamicamente un metodo su un oggetto dinamico?
- 13. dinamicamente aggiungendo metodi di classe ad una classe
- 14. In javascript, come posso chiamare un metodo di classe da un altro metodo nella stessa classe?
- 15. Come posso richiamare un metodo di classe da NSInvocation?
- 16. Come chiamare dinamicamente un metodo di classe in .NET?
- 17. Python __init__ setattr su argomenti?
- 18. Rimuovere un metodo solo da un'istanza
- 19. Scegliere dinamicamente la classe da ereditare da
- 20. Python - perché posso chiamare un metodo di classe con un'istanza?
- 21. C'è un filtro() opposto incorporato?
- 22. Opposto di Python per ... altro
- 23. Posso estendere una classe Ruby per comportarsi come OpenStruct dinamicamente?
- 24. Python - come posso ottenere il nome di classe all'interno di un metodo di classe - utilizzando @classmethod
- 25. C#: come si chiama un metodo statico di una classe base da un metodo statico di una classe derivata?
- 26. Come posso chiamare un metodo statico su una classe variabile?
- 27. creare dinamicamente una nuova classe JavaScript da un oggetto esistente
- 28. Come posso annullare un hash restituito da un metodo di una classe?
- 29. Istanziare una classe Python da un nome
- 30. È possibile rimuovere un metodo da un modulo?
Non funziona anche "del"? –
@JasonSperske: non se è necessario eliminare un attributo il cui nome viene calcolato a livello di codice. Puoi solo usare 'del' per cancellare un nome che puoi letteralmente digitare nel codice sorgente. – BrenBarn
@JasonSperske - il titolo dice "opposto di setattr" implicando che OP conosce il nome del metodo come una stringa ... – mgilson