Czy w Pythonie jest wbudowana metoda pobierania tablicy wszystkich zmiennych instancji klasy? Na przykład, jeśli mam ten kod:
class hi:
def __init__(self):
self.ii = "foo"
self.kk = "bar"
Czy istnieje sposób, aby to zrobić:
>>> mystery_method(hi)
["ii", "kk"]
Edycja: początkowo błędnie prosiłem o zmienne klasowe.
python
methods
instance-variables
Chris Bunch
źródło
źródło
Odpowiedzi:
Każdy obiekt ma
__dict__
zmienną zawierającą wszystkie zmienne i ich wartości.Spróbuj tego
źródło
Użyj vars ()
źródło
__method
jest prywatny,__method__
to specjalna metoda, niekoniecznie prywatna; Chciałbym powiedzieć, że metody specjalne definiują właściwości obiektu, a nie metody.__method__
są dość brzydkie i myślę, że zostały tak nazwane, aby próbować odstraszyć ludzi od ich używania, chyba że jest to absolutnie konieczne. W tym przypadku mamy alternatywne vars ().__str__
,__method__
są na samym języku normalnie. Co się dzieje, kiedystr(something)
?Zwykle nie można uzyskać atrybutów instancji, mając tylko klasę, a przynajmniej nie bez jej instancji. Możesz jednak pobrać atrybuty instancji dla danej instancji lub atrybuty klasy z daną klasą. Zobacz moduł „inspekcja”. Nie możesz uzyskać listy atrybutów instancji, ponieważ instancje naprawdę mogą mieć cokolwiek jako atrybut i - jak w twoim przykładzie - normalnym sposobem ich tworzenia jest po prostu przypisanie do nich w metodzie __init__.
Wyjątkiem jest sytuacja, gdy twoja klasa używa slotów, które są ustaloną listą atrybutów, które klasa zezwala na posiadanie instancji. Automaty są wyjaśnione w http://www.python.org/2.2.3/descrintro.html , ale są różne pułapki związane z automatami; wpływają na układ pamięci, więc dziedziczenie wielokrotne może być problematyczne, a dziedziczenie ogólnie musi również uwzględniać gniazda.
źródło
Obie metody Vars () i dict będą działać dla przykładu opublikowanego OP, ale nie będą działać dla „luźno” zdefiniowanych obiektów, takich jak:
Aby wydrukować wszystkie atrybuty, których nie można wywołać, możesz użyć następującej funkcji:
źródło
exec('print object.%s\n\n') % i
powinno być zapisane jakoprint getattr(object, i)
Możesz również sprawdzić, czy obiekt ma określoną zmienną za pomocą:
źródło
Twój przykład pokazuje „zmienne instancji”, a nie zmienne klasowe.
Poszukaj
hi_obj.__class__.__dict__.items()
zmiennych klasy wraz z innymi członkami klasy, takimi jak funkcje składowe i moduł zawierający.Zmienne klas są wspólne dla wszystkich instancji klasy.
źródło
Sugerować
Innymi słowy, po prostu otacza __dykt__
źródło
Chociaż nie jest to bezpośrednia odpowiedź na pytanie OP, istnieje całkiem słodki sposób sprawdzenia, jakie zmienne znajdują się w zakresie funkcji. spójrz na ten kod:
Atrybut func_code zawiera wiele interesujących rzeczy. Pozwala na zrobienie fajnych rzeczy. Oto przykład, jak to wykorzystałem:
źródło
zbudowany na odpowiedzi dmark, aby uzyskać następujące informacje, co jest przydatne, jeśli chcesz odpowiednika sprintf i miejmy nadzieję, że komuś pomoże ...
źródło
Czasami chcesz przefiltrować listę na podstawie zmiennych publicznych / prywatnych. Na przykład
źródło