คุณจะตั้งค่า / รับค่าคุณลักษณะของที่tกำหนดโดยได้xอย่างไร?
class Test:
def __init__(self):
self.attr1 = 1
self.attr2 = 2
t = Test()
x = "attr1"
คุณจะตั้งค่า / รับค่าคุณลักษณะของที่tกำหนดโดยได้xอย่างไร?
class Test:
def __init__(self):
self.attr1 = 1
self.attr2 = 2
t = Test()
x = "attr1"
คำตอบ:
มีฟังก์ชั่นในตัวที่เรียกว่าgetattrและsetattr
getattr(object, attrname)
setattr(object, attrname, value)
ในกรณีนี้
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
df1และตัวแปรx = 'df1'เช่น df1 เป็นสตริงใน var x ฉันต้องการที่จะพิมพ์รูปทรงของ DF เช่นนี้หรือgetattr(x, 'shape') getattr('df1', 'shape')ฉันรู้ว่าสิ่งนี้ไม่สามารถทำได้ด้วย getattr วิธีอื่นใด
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
หากคุณต้องการซ่อนตรรกะไว้ในชั้นเรียนคุณอาจต้องการใช้วิธีการทะเยอทะยานทั่วไปเช่น:
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? .