Đối tượng trong Python có thể có thuộc tính
Ví dụ, bạn có một đối tượng person
, có một số thuộc tính: name
, gender
vv
Bạn truy cập vào các thuộc tính (có thể là phương pháp hay đối tượng dữ liệu) thường viết: person.name
, person.gender
, person.the_method()
vv
Nhưng nếu bạn không biết tên thuộc tính tại thời điểm bạn viết chương trình thì sao? Ví dụ bạn có tên thuộc tính được lưu trữ trong một biến gọi là attr_name
.
nếu
attr_name = 'gender'
sau đó, thay vì viết
gender = person.gender
bạn có thể viết
gender = getattr(person, attr_name)
Một số thực hành:
Python 3.4.0 (default, Apr 11 2014, 13:05:11)
>>> class Person():
... name = 'Victor'
... def say(self, what):
... print(self.name, what)
...
>>> getattr(Person, 'name')
'Victor'
>>> attr_name = 'name'
>>> person = Person()
>>> getattr(person, attr_name)
'Victor'
>>> getattr(person, 'say')('Hello')
Victor Hello
getattr
sẽ tăng AttributeError
nếu thuộc tính với tên được đặt không tồn tại trong các đối tượng:
>>> getattr(person, 'age')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'age'
Nhưng bạn có thể vượt qua một giá trị mặc định như là đối số thứ ba, mà sẽ được trả lại nếu thuộc tính như vậy không tồn tại:
>>> getattr(person, 'age', 0)
0
Bạn có thể sử dụng cùng với getattr
dir
để lặp qua tất cả các tên thuộc tính và nhận được giá trị của họ:
>>> dir(1000)
['__abs__', '__add__', ..., '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> obj = 1000
>>> for attr_name in dir(obj):
... attr_value = getattr(obj, attr_name)
... print(attr_name, attr_value, callable(attr_value))
...
__abs__ <method-wrapper '__abs__' of int object at 0x7f4e927c2f90> True
...
bit_length <built-in method bit_length of int object at 0x7f4e927c2f90> True
...
>>> getattr(1000, 'bit_length')()
10
Cách sử dụng thực tế cho việc này là tìm tất cả các phương thức có tên bắt đầu bằng test
và call them.
Tương tự như getattr
có setattr
cho phép bạn thiết lập một thuộc tính của một đối tượng có tên của nó:
>>> setattr(person, 'name', 'Andrew')
>>> person.name # accessing instance attribute
'Andrew'
>>> Person.name # accessing class attribute
'Victor'
>>>
Bạn đang gặp sự cố với phần nào? Thuộc tính dưới dạng chuỗi? Các hàm hạng nhất? –
Tôi nghĩ rằng vấn đề của tôi là hiểu được khái niệm getattr(). Tôi vẫn không hiểu mục đích của nó. –
@Terence không trả lời của tôi làm cho mọi thứ rõ ràng hơn? –