Jak uzyskać nazwę klasy, w której obecnie się uczę?
Przykład:
def get_input(class_name):
[do things]
return class_name_result
class foo():
input = get_input([class name goes here])
Ze względu na charakter programu, z którym się łączę (vistrails), nie mogę go użyć __init__()
do inicjalizacji input
.
getName
z klasy podrzędnej, wyświetli nazwę klasy podrzędnej. To staje się trudne, jeśli NAPRAWDĘ chcesz mieć klasę, z którą pracujesz.getName
z klasy nadrzędnej spowoduje wyświetlenie nazwy klasy podrzędnej? Ok za wskazanie tego.getName()
potomnej w czasie wykonywania, nawet jeśli metoda jest zdefiniowana w nadklasie) jest poprawne.W treści klasy nazwa klasy nie jest jeszcze zdefiniowana, więc nie jest dostępna. Czy nie możesz po prostu wpisać nazwy klasy? Może chcesz powiedzieć więcej o problemie, abyśmy mogli znaleźć dla Ciebie rozwiązanie.
Utworzyłbym metaklasę, aby wykonać tę pracę za Ciebie. Jest wywoływana w czasie tworzenia klasy (koncepcyjnie na samym końcu klasy: blok) i może manipulować tworzoną klasą. Nie testowałem tego:
źródło
MyType
wsuper
wierszuInputAssigningMetaclass
?Możesz uzyskać do niego dostęp poprzez prywatne atrybuty klasy:
EDYTOWAĆ:
Jak powiedziano
Ned Batcheler
, to nie zadziała w treści klasy, ale zadziała w metodzie.źródło
Wprowadzono PEP 3155
__qualname__
, który został zaimplementowany w Pythonie 3.3.Jest dostępny z poziomu samej definicji klasy lub funkcji, na przykład:
efektywnie wydrukuje
Foo
. Otrzymasz w pełni kwalifikowaną nazwę (z wyłączeniem nazwy modułu), więc możesz podzielić ją na.
postać.Jednak nie ma sposobu, aby uzyskać faktyczne dojście do definiowanej klasy.
źródło
EDYCJA: Tak, możesz; ale musisz oszukiwać: nazwa aktualnie uruchomionej klasy jest obecna na stosie wywołań, a
traceback
moduł umożliwia dostęp do stosu.Jednak nie zrobiłbym tego; Moja pierwotna odpowiedź to nadal moje własne preferencje jako rozwiązanie. Oryginalna odpowiedź:
prawdopodobnie najprostszym rozwiązaniem jest użycie dekoratora, który jest podobny do odpowiedzi Neda obejmującego metaklasy, ale mniej potężny (dekoratorzy są zdolni do czarnej magii, ale metaklasy są zdolne do starożytnej, okultystycznej czarnej magii)
źródło
źródło
Myślę, że powinno być tak:
źródło