Bu özniteliğin adına karşılık gelen dizge verilen nesne özniteliğine nasıl erişilir


168

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:


305

getattrVe adı verilen yerleşik işlevler vardırsetattr

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

Bu durumda

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

13
Ayrıca öznitelikleri silmek için delattr vardır, ancak bu nadiren kullanılır.
Dave Kirby

12
ve bir nesnenin belirli bir özelliği olup olmadığını test etmek için ve hasattr, ancak bu durumda getattr (nesne, öznitelik adı, öntanımlı) üç bağımsız değişken biçimini kullanmak genellikle daha iyidir.
Duncan

getattr'i bunun gibi kullanabilir miyiz ve bir veri çerçevem ​​var ve var x'te bir dizge olarak bir 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.
ihightower

yapabilirsinizgetattr(globals()[x], 'shape')
afult

2

Not: Bu cevap çok eskidir. 2008'de kullanımdan kaldırılannew 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

0

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.