tTarafından verilen özniteliklerin değerlerini nasıl belirler / alırsınız x?
class Test:
def __init__(self):
self.attr1 = 1
self.attr2 = 2
t = Test()
x = "attr1"
Yanıtlar:
df1değişken, x = 'df1'yani df1 var mı? df'nin şeklini böyle yazdırmak istiyorum getattr(x, 'shape')veya getattr('df1', 'shape'). Bunun getattr veya başka yöntemlerle yapılamayacağını biliyorum.
getattr(globals()[x], 'shape')
new modülü kullanan Python 2 için geçerlidir .Setattr ve getattr'de yerleşik python işlevleri vardır. Bir sınıfın özniteliğini ayarlamak ve almak için kullanılabilir.
Kısa bir örnek:
>>> 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
Mantığı sınıfın içinde gizli tutmak istiyorsanız, aşağıdaki gibi genelleştirilmiş bir alıcı yöntemi kullanmayı tercih edebilirsiniz:
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)))
Çıktılar:
Attribute value of attr1 is 1
Onu daha iyi gizleyebilecek başka bir yaklaşım, sihirli yöntemi kullanmak olurdu __getattribute__, ancak bu yöntemin içindeki öznitelik değerini almaya çalışırken çözemediğim sonsuz bir döngü elde etmeye devam ettim.
Ayrıca alternatif olarak kullanabileceğinizi unutmayın vars(). Yukarıdaki örnekte, alışverişi olabilir getattr(self,varname)tarafından return vars(self)[varname], ama getattrverilen cevaba göre tercih olabilir arasındaki fark nedir varsve setattr? .