Is er een manier om een lijst te krijgen van attributen die bestaan op instanties van een 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))
Het gewenste resultaat is dat "multi, str" wordt uitgevoerd. Ik wil hiermee de huidige attributen van verschillende onderdelen van een script zien.
>>> 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'])
Misschien vindt u pprint ook nuttig.
>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'
Dit drukt natuurlijk alle methodes of attributen in de klasse definitie af. Je kunt "private" methoden uitsluiten door i.startwith('__')
te veranderen in i.startwith('_')
Waar wilt u dit voor? Het kan moeilijk zijn om u het beste antwoord te geven zonder uw precieze bedoeling te kennen.
Het is bijna altijd beter om dit handmatig te doen als je een instantie van je klasse op een specifieke manier wilt weergeven. Dit zal precies bevatten wat je wilt en niet bevatten wat je niet wilt, en de volgorde zal voorspelbaar zijn.
Als je een manier zoekt om de inhoud van een klasse weer te geven, formatteer dan handmatig de attributen waar je om geeft en geef dit als de __str__
of __repr__
methode voor je klasse.
Als je wilt weten welke methoden en dergelijke er voor een object bestaan om te begrijpen hoe het werkt, gebruik dan help
. help(a)
zal je een geformatteerde uitvoer tonen over de object's klasse gebaseerd op zijn docstrings.
dir
bestaat om programmatisch alle attributen van een object op te vragen. (Toegang tot __dict__
doet iets dat ik zou groeperen als hetzelfde, maar dat ik zelf niet zou gebruiken). Het kan echter zijn dat dit geen dingen bevat die je wilt en het kan dingen bevatten die je niet wilt. Het is onbetrouwbaar en mensen denken dat ze het veel vaker willen dan ze doen.
Een enigszins orthogonale opmerking: er is op dit moment erg weinig ondersteuning voor Python 3. Als je geïnteresseerd bent in het schrijven van echte software zul je third-party dingen willen zoals numpy, lxml, Twisted, PIL, of een willekeurig aantal web frameworks die Python 3 nog niet ondersteunen en ook geen plannen hebben om dat binnenkort te gaan doen. De verschillen tussen 2.6 en de 3.x tak zijn klein, maar het verschil in bibliotheekondersteuning is enorm.