วิธีการเข้าถึงแอตทริบิวต์วัตถุที่กำหนดสตริงที่สอดคล้องกับชื่อของคุณลักษณะนั้น


154

คุณจะตั้งค่า / รับค่าคุณลักษณะของที่tกำหนดโดยได้xอย่างไร?

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

t = Test()
x = "attr1"

คำตอบ:


284

มีฟังก์ชั่นในตัวที่เรียกว่าgetattrและsetattr

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

ในกรณีนี้

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

12
นอกจากนี้ยังมี delattr สำหรับการลบแอททริบิว แต่ไม่ค่อยใช้
เดฟเคอร์บี้

11
และ hasattr สำหรับการทดสอบว่าวัตถุนั้นมี attr ที่เฉพาะเจาะจงหรือไม่แม้ว่าในกรณีนั้นการใช้รูปแบบอาร์กิวเมนต์สาม getattr (object, attrname, default) มักจะดีกว่า
ดันแคน

มีอยู่แล้วเราสามารถใช้ getattr เช่นนี้และบอกว่าฉันมี dataframe df1และตัวแปรx = 'df1'เช่น df1 เป็นสตริงใน var x ฉันต้องการที่จะพิมพ์รูปทรงของ DF เช่นนี้หรือgetattr(x, 'shape') getattr('df1', 'shape')ฉันรู้ว่าสิ่งนี้ไม่สามารถทำได้ด้วย getattr วิธีอื่นใด
ihightower

3

หมายเหตุ: คำตอบนี้ล้าสมัยมาก ซึ่งจะใช้กับงูหลาม 2 โดยใช้newโมดูลที่ถูกเลิกใช้ในปี 2008

มีไพ ธ อนฟังก์ชั่น setattr และ getattr ซึ่งสามารถใช้ในการตั้งค่าและรับคุณลักษณะของคลาส

ตัวอย่างสั้น ๆ :

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

หากคุณต้องการซ่อนตรรกะไว้ในชั้นเรียนคุณอาจต้องการใช้วิธีการทะเยอทะยานทั่วไปเช่น:

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

ขาออก:

Attribute value of attr1 is 1

apporach อื่นที่สามารถซ่อนได้ดียิ่งขึ้นจะใช้วิธีเวทย์มนตร์__getattribute__แต่ฉันยังคงวนซ้ำไม่รู้จบซึ่งฉันไม่สามารถแก้ไขได้เมื่อพยายามดึงค่าคุณลักษณะในวิธีนั้น

โปรดทราบว่าคุณสามารถใช้อีกวิธีหนึ่งvars()ได้ ในตัวอย่างข้างต้นคุณสามารถแลกเปลี่ยนgetattr(self,varname)โดยreturn vars(self)[varname]แต่getattrอาจจะดีกว่าตามคำตอบของอะไรคือความแตกต่างระหว่างvarsและsetattr? .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.