Hoe toegang te krijgen tot objectkenmerk gegeven string die overeenkomt met de naam van dat kenmerk

Hoe stel/krijg je de waarden van attributen van tgegeven door x?

class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2
t = Test()
x = "attr1"

Antwoord 1, autoriteit 100%

Er zijn ingebouwde functies genaamd getattren setattr

getattr(object, attrname)
setattr(object, attrname, value)

In dit geval

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)

Antwoord 2

Als je de logica verborgen wilt houden in de klasse, kun je er de voorkeur aan geven een algemene gettermethode te gebruiken, zoals:

class Test:
    def __init__(self):
        self.attr1 = 1
        self.attr2 = 2
    def get(self,varname):
        return getattr(self,varname)
t = Test()
x = "attr1"
print ("Attribute value of {0} is {1}".format(x, t.get(x)))

Uitgangen:

Attribute value of attr1 is 1

Een andere benadering die het nog beter zou kunnen verbergen, is het gebruik van de magische methode __getattribute__, maar ik kreeg steeds een eindeloze lus die ik niet kon oplossen toen ik probeerde de attribuutwaarde binnen die methode op te halen .

Houd er rekening mee dat u ook vars()kunt gebruiken. In het bovenstaande voorbeeld zou je getattr(self,varname)kunnen omwisselen door return vars(self)[varname], maar getattrheeft misschien de voorkeur volgens het antwoord op Wat is het verschil tussen varsen setattr?.


Antwoord 3

Opmerking: dit antwoord is erg achterhaald. Het is van toepassing op Python 2 met behulp van de new-module die verouderd in 2008.

Er is python ingebouwde functies setattr en getattr. Die kan worden gebruikt om het kenmerk van een klasse in te stellen en op te halen.

Een kort voorbeeld:

>>> from new import  classobj
>>> obj = classobj('Test', (object,), {'attr1': int, 'attr2': int}) # Just created a class
>>> setattr(obj, 'attr1', 10)
>>> setattr(obj, 'attr2', 20)
>>> getattr(obj, 'attr1')
10
>>> getattr(obj, 'attr2')
20

Other episodes