Alle objectattributen in Python ophalen?

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 .feathersheeft.


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))

Other episodes