Câu trả lời:
Có các hàm dựng sẵn được gọi getattr
vàsetattr
getattr(object, attrname)
setattr(object, attrname, value)
Trong trường hợp này
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
df1
và một biến x = 'df1'
tức là df1 như một chuỗi trong var x. tôi muốn in hình dạng của df như thế này, getattr(x, 'shape')
hoặc getattr('df1', 'shape')
. Tôi biết điều này không thể được thực hiện với getattr, bất kỳ phương pháp nào khác.
new
mô-đun không dùng nữa trong năm 2008 .Có python được xây dựng trong các chức năng setattr và getattr. Mà có thể được sử dụng để thiết lập và có được thuộc tính của một lớp.
Một ví dụ ngắn gọn:
>>> 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
Nếu bạn muốn giữ logic ẩn bên trong lớp, bạn có thể thích sử dụng một phương thức getter tổng quát như vậy:
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)))
Đầu ra:
Attribute value of attr1 is 1
Một apporach khác có thể che giấu nó thậm chí còn tốt hơn là sử dụng phương thức ma thuật __getattribute__
, nhưng tôi cứ bị một vòng lặp vô tận mà tôi không thể giải quyết khi cố lấy lại giá trị thuộc tính bên trong phương thức đó.
Cũng lưu ý rằng bạn có thể thay thế sử dụng vars()
. Trong ví dụ trên, bạn có thể trao đổi getattr(self,varname)
bằng return vars(self)[varname]
, nhưng getattr
có thể thích hợp hơn theo câu trả lời cho sự khác biệt giữa vars
và là setattr
gì? .