Nie wiem, czy mam tutaj dobry projekt, ale mam klasę wywodzącą się z unittest.TestCase i sposób, w jaki ja Po skonfigurowaniu, mój kod będzie dynamicznie wprowadzał do klasy kilka metod test_*
przed wywołaniem unittest, aby je uruchomić. Używam do tego setattr
. To działa dobrze, ale teraz mam sytuację, w której chcę usunąć metody wcześniej wstrzyknięte i wstrzyknąć nowy zestaw metod. Jak mogę usunąć wszystkie metody w klasie, której nazwy pasują do wzorca test_*
?Python - jak mogę dynamicznie usunąć metodę z klasy - tj. Przeciwieństwo setattr
5
A
Odpowiedz
14
Nazywa się delattr
i jest dokumentowany here.
3
>>> class Foo:
def func(self):
pass
...
>>> dir(Foo)
['__doc__', '__module__', 'func']
>>> del Foo.func
>>> dir(Foo)
['__doc__', '__module__']
1
delattr()
jest to, co chcesz. Przeprowadź pętlę przez klasę vars()
i przetestuj nazwy atrybutów zaczynające się od "test_"
. Np
@classmethod
def remove_test_methods(cls):
for name in list(vars(cls)):
if name.startswith("test_") and callable(getattr(cls, name)):
delattr(cls, name)
Radzę przed użyciem dir()
, jak będzie to pokazać nazwy z klas nadrzędnych, tak więc nie wszystkie nazwy można uzyskać z dir()
może zdefiniowane na klasie jesteś kierowania.
0
Jako dodatek do poprzednich odpowiedzi: Jeśli metoda ma zostać usunięty zostaje ponownie wprowadzone, trzeba by usunąć metod klasy i podklasy rodzicem, zarówno:
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
(lub skorzystać z delattr
Odpowiedź @ BrenBarn)
Powiązane problemy
- 1. Dodaj metodę do klasy dynamicznie z dekoratorem
- 2. Python: Przeciwieństwo `datetime.date.isocalendar()`
- 3. Jak dynamicznie wywoływać metodę klasy w PHP?
- 4. Jak mogę dynamicznie definiować metodę aliasu dla metody klasy?
- 5. Jak wywołać metodę klasy dynamicznie w Ruby
- 6. Jak wywołać metodę python z klasy java?
- 7. Python __init__ setattr na argumenty?
- 8. Jak mogę wywołać dynamicznie wybraną metodę klienta SignalR z IHubContext?
- 9. Dynamicznie przypisz metodę/metodę jako zmienną
- 10. Jak mogę dynamicznie ustawić nazwę klasy?
- 11. Dynamicznie uzyskać nazwę klasy na poziomie klasy zmiennej w python
- 12. Kłopoty próby dynamicznie dodać metody do klasy Pythona (tj django-tables2 „Tabela”)
- 13. Jak wywołać metodę klasy?
- 14. Jak udekorować metodę wewnątrz klasy?
- 15. Jak mogę dynamicznie określać atrybut "list_display" klasy Django ModelAdmin?
- 16. Jak usunąć metodę z javascript typu
- 17. jak wywołać metodę getsupportfragmentmanager() z klasy adaptera?
- 18. Jak zrobić przeciwieństwo diff?
- 19. jak wywołać metodę klasy z innej aplikacjiDomain
- 20. Jak usunąć metodę przy użyciu Javassist?
- 21. Python - czy mogę programowo dekorować metody klasy z instancji klasy?
- 22. jquery usunąć wszystkie klasy z klasy
- 23. Jak dynamicznie wywołać ogólną metodę rozszerzenia?
- 24. Jak mogę wywołać metodę klasy wewnątrz obietnicy w Angular 2?
- 25. Dynamicznie tworzenie klas - Python
- 26. Jak dynamicznie definiować metodę jako prywatną?
- 27. Jak wywołać metodę dynamicznie nazwaną w JavaScript?
- 28. Jak mogę wkroczyć w podstawową metodę klasy java w Eclipse?
- 29. Szyny: dynamicznie definiuj metodę klasy opartą na nadrzędnej nazwie klasy w module/problemie
- 30. Dodaj nową metodę do klasy Template Python Swig
Czy też "del" nie działa? –
@JasonSperske: Nie, jeśli musisz usunąć atrybut, którego nazwa została obliczona programowo. Możesz użyć tylko 'del', aby usunąć nazwę, którą możesz dosłownie wpisać w kodzie źródłowym. – BrenBarn
@JasonSperske - tytuł mówi "przeciwieństwo setattr", co oznacza, że OP zna nazwę metody jako ciąg ... – mgilson