Cách truy cập thuộc tính đối tượng chuỗi đã cho tương ứng với tên của thuộc tính đó


153

Làm thế nào để bạn thiết lập / nhận các giá trị của các thuộc tính tđược đưa ra bởi x?

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

t = Test()
x = "attr1"

Câu trả lời:


284

Có các hàm dựng sẵn được gọi getattrsetattr

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

Trong trường hợp này

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

12
Ngoài ra còn có delattr để xóa các thuộc tính, nhưng điều này hiếm khi được sử dụng.
Dave Kirby

11
và hasattr để kiểm tra xem một đối tượng có một attr cụ thể hay không, mặc dù trong trường hợp đó, sử dụng ba mẫu đối số getattr (object, attrname, default) thường tốt hơn.
Duncan

dù sao chúng ta cũng có thể sử dụng getattr như thế này và nói rằng tôi có một khung dữ liệu 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.
ihightower

3

Lưu ý: Câu trả lời này rất lỗi thời. Nó áp dụng cho Python 2 bằng cách sử dụng 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

0

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.