Cara mengakses atribut objek diberi string yang sesuai dengan nama atribut itu

154

Bagaimana Anda mengatur / mendapatkan nilai atribut yang tdiberikan oleh x?

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

t = Test()
x = "attr1"
Nullpoet
sumber

Jawaban:

285

Ada fungsi built-in yang disebut getattrdansetattr

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

Pada kasus ini

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
Pratik Deoghare
sumber
12
Ada juga delattr untuk menghapus atribut, tetapi ini jarang digunakan.
Dave Kirby
11
dan hasattr untuk menguji apakah suatu objek memiliki attr tertentu meskipun dalam kasus itu menggunakan tiga argumen getattr (objek, attrname, default) seringkali lebih baik.
Duncan
adakah di sana kita dapat menggunakan getattr seperti ini dan mengatakan saya memiliki dataframe df1, dan variabel x = 'df1'yaitu df1 sebagai string di var x. saya ingin mencetak bentuk df seperti ini, getattr(x, 'shape')atau getattr('df1', 'shape'). Saya tahu ini tidak dapat dilakukan dengan getattr, metode lainnya.
ihightower
Anda bisa melakukannyagetattr(globals()[x], 'shape')
afult
3

Catatan: Jawaban ini sangat usang. Ini berlaku untuk Python 2 menggunakan newmodul yang sudah usang pada 2008 .

Ada python yang dibangun di fungsi setattr dan getattr. Yang bisa digunakan untuk mengatur dan mendapatkan atribut suatu kelas.

Contoh singkat:

>>> 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
aatifh
sumber
0

Jika Anda ingin menyembunyikan logika di dalam kelas, Anda mungkin lebih suka menggunakan metode pengambil yang umum seperti:

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

Output:

Attribute value of attr1 is 1

Apporach lain yang bisa menyembunyikannya lebih baik adalah menggunakan metode ajaib __getattribute__, tetapi saya terus mendapatkan loop tanpa akhir yang tidak dapat saya selesaikan ketika mencoba untuk mendapatkan nilai atribut di dalam metode tersebut.

Perhatikan juga bahwa Anda dapat menggunakannya sebagai alternatif vars(). Dalam contoh di atas, Anda dapat bertukar getattr(self,varname)dengan return vars(self)[varname], tetapi getattrmungkin lebih disukai sesuai dengan jawaban untuk Apa perbedaan antara varsdan setattr? .

not2savvy
sumber