Ar yra būdas paimti klasės egzempliorių atributų sąrašą?
class new_class():
def __init__(self, number):
self.multi = int(number) * 2
self.str = str(number)
a = new_class(2)
print(', '.join(a.SOMETHING))
Norimas rezultatas yra toks: "multi, str" bus išvestas. Noriu, kad tai leistų matyti esamus atributus iš įvairių scenarijaus dalių.
>>> 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'])
Jums taip pat gali būti naudinga pprint.
>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'
Tai, žinoma, atspausdins visus klasės apibrėžtyje esančius metodus ar atributus. Galite neįtraukti "privačių" metodų, pakeisdami i.startwith('__')
į i.startwith('_')
.
Kam to reikia? Gali būti sunku pateikti geriausią atsakymą, jei nežinosite, ką tiksliai ketinate daryti.
Beveik visada geriau tai atlikti rankiniu būdu, jei norite, kad jūsų klasės egzempliorius būtų rodomas tam tikru būdu. Tai apims būtent tai, ko norite, ir neapims to, ko nenorite, o tvarka bus nuspėjama.
Jei ieškote būdo, kaip rodyti klasės turinį, rankiniu būdu suformatuokite jums rūpimus atributus ir pateikite tai kaip __str__
arba __repr__
metodą savo klasei.
Jei norite sužinoti, kokie metodai ir pan. egzistuoja objektui, kad suprastumėte, kaip jis veikia, naudokite help
. help(a)
parodys suformatuotą išvestį apie objekto klasę, pagrįstą jo dokumentais.
dir
yra skirtas programiškai gauti visus objekto atributus. (Prieiga prie __dict__
atlieka tai, ką aš priskirčiau prie tų pačių funkcijų, bet pats to nenaudočiau). Tačiau tai gali apimti ne tuos dalykus, kurių norite, ir gali apimti dalykus, kurių nenorite. Tai nepatikima, ir žmonės mano, kad jie to nori daug dažniau, nei iš tikrųjų nori.
Šiek tiek ortogonali pastaba: šiuo metu labai mažai palaikomas Python 3. Jei norite rašyti tikrą programinę įrangą, jums reikės trečiųjų šalių programų, tokių kaip numpy, lxml, Twisted, PIL ar bet kurios kitos žiniatinklio struktūros, kurios dar nepalaiko Python 3 ir artimiausiu metu neplanuoja to daryti. Skirtumai tarp 2.6 ir 3.x atšakos yra nedideli, tačiau bibliotekų palaikymo skirtumas yra didžiulis.