Czy istnieje sposób na pobranie listy atrybutów istniejących w instancjach klasy?
class new_class():
def __init__(self, number):
self.multi = int(number) * 2
self.str = str(number)
a = new_class(2)
print(', '.join(a.SOMETHING))
Pożądanym rezultatem jest wyprowadzenie „multi, str”. Chcę, aby zobaczył bieżące atrybuty z różnych części skryptu.
python
class
python-3.x
MadSc13ntist
źródło
źródło
NewClass
. Możesz przeciwstawić się oczekiwaniom ludzi, jeśli zastosujesz taką konwencję nazewnictwanew_class
.help()
funkcja pomaga uzyskać informacje o klasach, funkcjach, wbudowanych modułach i nie tylkoOdpowiedzi:
Pomocny może być również pprint .
źródło
pprint.pprint(a.__dict__)
robi ładny wydruk na atrybutach.pprint
to NIE działa w Pythonie 2.6.Następnie możesz przetestować, jaki typ jest za pomocą
type()
lub czy jest to metoda za pomocącallable()
.źródło
boston
dała mi wszystkie dostępne atrybuty w zbiorze danych od sklearn -__dict__
była pusta, podczas gdy w rzeczywistości było 5 dostępnych atrybutówvars(obj)
zwraca atrybuty obiektu.źródło
Wszystkie poprzednie odpowiedzi są poprawne, masz trzy opcje na to, o co pytasz
dir()
vars()
__dict__
źródło
vars(foo)
zwrotyfoo.__dict__
To oczywiście wydrukuje dowolne metody lub atrybuty w definicji klasy. Możesz wykluczyć metody „prywatne”, zmieniając
i.startwith('__')
nai.startwith('_')
źródło
Sprawdzić moduł zapewnia proste sposoby przeprowadzenia inspekcji obiektu:
Za pomocą
getmembers()
możesz zobaczyć wszystkie atrybuty swojej klasy wraz z ich wartością. Aby wykluczyć atrybuty prywatne lub chronione, użyj.startswith('_')
. Aby wykluczyć metody lub funkcje, użyjinspect.ismethod()
lubinspect.isfunction()
.Zauważ, że
ismethod()
jest używany na drugim elemencie,i
ponieważ pierwszy jest po prostu łańcuchem (jego nazwą).Offtopic: Użyj CamelCase dla nazw klas.
źródło
Możesz użyć,
dir(your_object)
aby uzyskać atrybuty igetattr(your_object, your_object_attr)
uzyskać wartościstosowanie :
Jest to szczególnie przydatne, jeśli Twój obiekt nie ma __dict__. Jeśli tak nie jest, możesz także spróbować var (twój_obiekt)
źródło
Często wspomina się, że aby wyświetlić pełną listę atrybutów, których należy użyć
dir()
. Zauważ jednak, że wbrew powszechnemu przekonaniudir()
nie ujawnia wszystkich atrybutów. Na przykład możesz zauważyć, że__name__
może brakować nadir()
liście klas, nawet jeśli możesz uzyskać do niej dostęp z samej klasy. Z poziomu dokumentudir()
( Python 2 , Python 3 ):Funkcja taka jak poniżej jest zazwyczaj bardziej kompletna, chociaż nie ma gwarancji kompletności, ponieważ na listę zwracaną przez
dir()
może wpływać wiele czynników, w tym implementacja__dir__()
metody, dostosowanie__getattr__()
lub__getattribute__()
klasa lub jedno z jej rodziców. Zobacz podane linki, aby uzyskać więcej informacji.źródło
Po co to chcesz? Uzyskiwanie najlepszej odpowiedzi może być trudne bez znajomości swoich intencji.
Prawie zawsze lepiej jest to zrobić ręcznie, jeśli chcesz wyświetlić instancję swojej klasy w określony sposób. Dotyczy to dokładnie tego, czego chcesz, a nie tego, czego nie chcesz, a kolejność będzie przewidywalna.
Jeśli szukasz sposobu wyświetlania zawartości klasy, ręcznie sformatuj atrybuty, na których Ci zależy, i podaj jako metodę
__str__
lub__repr__
metodę dla swojej klasy.Jeśli chcesz dowiedzieć się, jakie metody istnieją i aby obiekt mógł zrozumieć, jak to działa, użyj
help
.help(a)
pokaże sformatowane dane wyjściowe na temat klasy obiektu na podstawie jego dokumentów.dir
istnieje, aby programowo uzyskać wszystkie atrybuty obiektu. (Accessing__dict__
robi coś, co zgrupowałbym jako to samo, ale którego sam nie użyłbym.) Może to jednak nie obejmować rzeczy, które chcesz, i może obejmować rzeczy, których nie chcesz. Jest niewiarygodny i ludzie myślą, że chcą tego częściej niż oni.Z nieco ortogonalnej nuty, obecnie wsparcie dla Pythona 3 jest bardzo małe. Jeśli jesteś zainteresowany pisaniem prawdziwego oprogramowania, będziesz potrzebować rzeczy innych firm, takich jak numpy, lxml, Twisted, PIL lub dowolna liczba frameworków, które nie obsługują jeszcze Python 3 i nie planują zbyt szybko. Różnice między wersją 2.6 a gałęzią 3.x są niewielkie, ale różnica w obsłudze bibliotek jest ogromna.
źródło
Jest na to więcej niż jeden sposób:
Po uruchomieniu ten kod generuje:
źródło
Zobacz skrypt powłoki Pythona, który został wykonany sekwencyjnie, tutaj otrzymasz atrybuty klasy w formacie łańcuchowym oddzielone przecinkami.
Używam Pythona 3.4
źródło
a.__dict__.keys()
. Jeśli jednak chcesz wiedzieć, czy obiekt ma określony atrybut, możesz go użyćhasattr
.Oprócz tych odpowiedzi dołączę funkcję (python 3) do wyrzucania praktycznie całej struktury dowolnej wartości. Służy
dir
do ustalenia pełnej listy nazw właściwości, a następnie używagetattr
każdej nazwy. Wyświetla typ każdego elementu wartości, a jeśli to możliwe, wyświetla również cały element:Teraz każdy z poniższych powinien dać wgląd:
źródło
Uzyskaj atrybuty obiektu
Wynik
źródło
Jak napisano przed użyciem,
obj.__dict__
może obsługiwać typowe przypadki, ale niektóre klasy nie mają__dict__
atrybutu i zastosowania__slots__
(głównie ze względu na wydajność pamięci).przykład bardziej odpornego sposobu:
wyjście tego kodu:
Uwaga 1:
Python jest językiem dynamicznym i zawsze lepiej jest znać klasy, z których próbujesz uzyskać atrybuty, ponieważ nawet ten kod może przeoczyć niektóre przypadki.
Uwaga 2:
ten kod wyprowadza tylko zmienne instancji, co oznacza, że zmienne klas nie są dostarczane. na przykład:
kod wyjściowy:
Ten kod nie drukuje
url
atrybutu klasy i może pomijać pożądane atrybuty klasy.Czasami możemy myśleć, że atrybut jest członkiem instancji, ale nie jest i nie będzie pokazany na tym przykładzie.
źródło
__dict__
i__slots__
dlatego prawdopodobnie chcesz wypróbować oba, a nie tylko dyktando.__dict__
lubvars
nie działa, ponieważ gubi się__slots__
.__dict__
i__slots__
nie działa, ponieważ brakuje__slots__
klas podstawowych.dir
nie działa, ponieważ obejmuje atrybuty klas, takie jak metody lub właściwości, a także atrybuty obiektu.vars
jest równoważne użyciu__dict__
.To najlepsze, co mam:
źródło
źródło
Zobacz sekwencję wykonywania skryptów powłoki Pythona w sekwencjach, da to rozwiązanie od utworzenia klasy do wyodrębnienia nazw pól instancji.
źródło
__attr__
podaje listę atrybutów instancji.źródło
__attr__
w opisie, ale używacie go__attrs__
w kodzie. Żadne z nich nie działało dla mnie (werkzeug.datastructures.FileStorage)