Hoe stel/krijg je de waarden van attributen van t
gegeven 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 getattr
en 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 getattr
heeft misschien de voorkeur volgens het antwoord op Wat is het verschil tussen vars
en 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