Jak znaleźć nazwę klasy, która utworzyła instancję obiektu w Pythonie, jeśli funkcja, z której to robię, jest klasą podstawową, z której wywodzi się klasa instancji?
Zastanawiałem się, czy moduł inspekcji mógł mi tutaj pomóc, ale wydaje się, że nie daje mi tego, czego chcę. Poza analizowaniem __class__
członka, nie jestem pewien, jak uzyskać te informacje.
Odpowiedzi:
Próbowałeś już
__name__
atrybutu klasy? tj.type(x).__name__
poda ci nazwę klasy, która moim zdaniem jest tym, czego chcesz.Jeśli nadal używasz języka Python 2, zauważ, że powyższa metoda działa tylko z klasami w nowym stylu (w Python 3+ wszystkie klasy są klasami „w nowym stylu”). Twój kod może używać klas w starym stylu. Następujące działa dla obu:
źródło
dir(x.__class__)
go nie wymieniono?__class__
z tejtype
metody? Tak:type(x).__name__
. Czy odradzanie bezpośredniego wywoływania członków z podwójnym podkreśleniem nie jest odradzane? Nie widzę jednak sposobu na obejście__name__
tego.__class__
bezpośrednio, aby być kompatybilnym z klasami w starym stylu, ponieważ ich typ jest po prostuinstance
.def typename(x): return type(x).__name__
Czy chcesz, aby nazwa klasy była łańcuchem?
źródło
rodzaj() ?
źródło
self.__class__.__name__
zamiasttype(self).__name__
uzyskać takie samo zachowanie. Chyba że istniejetype()
funkcja, o której nie wiem?type(item)
na elemencie listy wynik będzie<type 'instance'>
natomiastitem.__class__.__name__
posiada nazwę klasy.Powyższy przykładowy kod (po wprowadzeniu do interaktywnego interpretera) wygeneruje,
'__main__.A'
w przeciwieństwie do tego,'A'
który zostanie wygenerowany, jeśli__name__
atrybut zostanie wywołany. Po prostu przekazując wynikA.__class__
dostr
konstruktora, parsowanie jest obsługiwane. Możesz jednak użyć następującego kodu, jeśli chcesz czegoś bardziej wyraźnego.Takie zachowanie może być preferowane, jeśli masz klasy o tej samej nazwie zdefiniowane w oddzielnych modułach.
Przykładowy kod podany powyżej został przetestowany w Pythonie 2.7.5.
źródło
Przykład:
źródło
Dobre pytanie.
Oto prosty przykład oparty na GHZ, który może komuś pomóc:
źródło
Alternatywnie możesz użyć
classmethod
dekoratora:Zastosowanie :
źródło
Oprócz
__name__
zdobycia specjalnego atrybutu, możesz potrzebować kwalifikowanej nazwy dla danej klasy / funkcji. Odbywa się to poprzez chwytanie typów__qualname__
.W większości przypadków będą one dokładnie takie same, ale w przypadku zagnieżdżonych klas / metod różnią się one uzyskanymi wynikami. Na przykład:
Ponieważ szukasz introspekcji, zawsze warto to rozważyć.
źródło
__qualname__
dotyczy Python 3.3+__qualname__
vs__name__
: stackoverflow.com/questions/58108488/what-is-qualname-in-pythonAby uzyskać instancję nazwa klasy:
lub
oba są takie same
źródło