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"

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)

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.