Is er een manier om alleattributen/methods/fields/etc. van een object in Python?
vars()
komt dichtbijin de buurt van wat ik wil, maar het werkt niet tenzij een object een __dict__
heeft, wat ‘ t altijd waar (het is bijvoorbeeld niet waar voor een list
, een dict
, enz.).
Antwoord 1, autoriteit 100%
Gebruik de ingebouwde functie dir()
.
Antwoord 2, autoriteit 17%
Wat je waarschijnlijk wilt is dir()
.
Het probleem is dat klassen de speciale methode __dir__
kunnen overschrijven, waardoor dir()
alles teruggeeft wat de klasse wil (hoewel ze worden aangemoedigd om een nauwkeurige lijst, dit wordt niet afgedwongen). Verder kunnen sommige objecten dynamische attributen implementeren door __getattr__
te overschrijven, dit kunnen RPC-proxy-objecten zijn of instanties van C-extensieklassen. Als uw object een van deze voorbeelden is, hebben ze mogelijk geen __dict__
ofeen uitgebreide lijst met attributen via __dir__
: veel van deze objecten kunnen zoveel dynamische kenmerken hebben dat ze niet echt weten watze hebben totdat je er toegang toe probeert te krijgen.
Op de korte termijn, als dir()
niet voldoende is, kun je een functie schrijven die __dict__
doorloopt voor een object, en vervolgens __dict__
voor alle klassen in obj.__class__.__mro__
; hoewel dit alleen werkt voor normale python-objecten. Op de lange termijn moet je misschien eend typen + aannames gebruiken – als het op een eend lijkt, kruis dan je vingers en hoop dat het .feathers
heeft.
Antwoord 3, autoriteit 17%
Ik gebruik __dict__
en dir(<instance>)
Voorbeeld:
class MyObj(object):
def __init__(self):
self.name = 'Chuck Norris'
self.phone = '+6661'
obj = MyObj()
print(obj.__dict__)
print(dir(obj))
# Output:
# obj.__dict__ --> {'phone': '+6661', 'name': 'Chuck Norris'}
#
# dir(obj) --> ['__class__', '__delattr__', '__dict__', '__doc__',
# '__format__', '__getattribute__', '__hash__',
# '__init__', '__module__', '__new__', '__reduce__',
# '__reduce_ex__', '__repr__', '__setattr__',
# '__sizeof__', '__str__', '__subclasshook__',
# '__weakref__', 'name', 'phone']
Antwoord 4, autoriteit 9%
Je kunt dir(your_object)
gebruiken om de attributen te krijgen en getattr(your_object, your_object_attr)
om de waarden te krijgen
gebruik:
for att in dir(your_object):
print (att, getattr(your_object,att))