Er der en måde at få fat i en liste over attributter, der findes på instanser af en klasse?
class new_class():
def __init__(self, number):
self.multi = int(number) * 2
self.str = str(number)
a = new_class(2)
print(', '.join(a.SOMETHING))
Det ønskede resultat er, at "multi, str" vil blive output. Jeg ønsker dette for at se de aktuelle attributter fra forskellige dele af et script.
>>> class new_class():
... def __init__(self, number):
... self.multi = int(number) * 2
... self.str = str(number)
...
>>> a = new_class(2)
>>> a.__dict__
{'multi': 4, 'str': '2'}
>>> a.__dict__.keys()
dict_keys(['multi', 'str'])
Du kan også finde pprint nyttigt.
>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'
Dette vil naturligvis udskrive alle metoder eller attributter i klassedefinitionen. Du kan udelukke "private" metoder ved at ændre i.startwith('__')
til i.startwith('_')
Hvad skal du bruge den til? Det kan være svært at give dig det bedste svar, hvis du ikke kender din præcise hensigt.
Det er næsten altid bedre at gøre dette manuelt, hvis du ønsker at vise en instans af din klasse på en bestemt måde. Dette vil indeholde præcis det, du ønsker, og ikke indeholde det, du ikke ønsker, og rækkefølgen vil være forudsigelig.
Hvis du leder efter en måde at vise indholdet af en klasse på, skal du manuelt formatere de attributter, du er interesseret i, og give dette som __str__
eller __repr__
-metoden for din klasse.
Hvis du vil vide, hvilke metoder og lignende der findes for et objekt for at forstå, hvordan det fungerer, skal du bruge help
. help(a)
vil vise dig et formateret output om objektets klasse baseret på dets docstrings.
dir
eksisterer for at få alle attributterne for et objekt på programmeringsbasis. (Adgang til __dict__
gør noget, som jeg ville gruppere som det samme, men som jeg ikke selv ville bruge). Dette omfatter dog muligvis ikke ting, som du ønsker, og det omfatter muligvis ting, som du ikke ønsker. Det er upålideligt, og folk tror, at de ønsker det meget oftere, end de gør.
På en lidt ortogonal note er der meget lidt støtte til Python 3 på nuværende tidspunkt. Hvis du er interesseret i at skrive rigtig software, vil du have ting fra tredjeparter som numpy, lxml, Twisted, PIL eller en række webrammer, som endnu ikke understøtter Python 3 og ikke har planer om at gøre det i nær fremtid. Forskellene mellem 2.6 og 3.x-grenen er små, men forskellen i biblioteksunderstøttelse er enorm.