Các đối tượng trong Python có thể có các thuộc tính - các thuộc tính dữ liệu và các hàm để làm việc với các (các phương thức) đó. Trên thực tế, mọi đối tượng đều có các thuộc tính tích hợp.
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 được gọi 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 đã cho không tồn tại trong đố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ể chuyển một giá trị mặc định làm đối số thứ ba, sẽ được trả về nếu thuộc tính đó không tồn tại:
>>> getattr(person, 'age', 0)
0
Bạn có thể sử dụng getattr
cùng với dir
để lặp lại tất cả các tên thuộc tính và nhận các giá trị của chúng:
>>> 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
Một cách sử dụng thực tế cho việc này sẽ là tìm tất cả các phương thức có tên bắt đầu test
và gọi chúng .
Tương tự như getattr
ở setattr
đó cho phép bạn đặ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'
>>>