Câu trả lời:
Có các hàm dựng sẵn được gọi getattrvàsetattr
getattr(object, attrname)
setattr(object, attrname, value)
Trong trường hợp này
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
df1và 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.
newmô-đ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 getattrcó thể thích hợp hơn theo câu trả lời cho sự khác biệt giữa varsvà là setattrgì? .