วัตถุใน Python สามารถมีคุณลักษณะได้ - คุณลักษณะของข้อมูลและฟังก์ชั่นในการทำงานกับ (วิธีการ) ที่จริงแล้วทุกวัตถุมีคุณสมบัติในตัว
ตัวอย่างเช่นคุณมีวัตถุperson
ที่มีคุณลักษณะหลายname
, gender
ฯลฯ
คุณสามารถเข้าถึงคุณลักษณะเหล่านี้ (ไม่ว่าจะเป็นวิธีการหรือวัตถุข้อมูล) มักเขียน: person.name
, person.gender
, person.the_method()
ฯลฯ
แต่ถ้าคุณไม่ทราบชื่อของแอททริบิวในเวลาที่คุณเขียนโปรแกรม attr_name
ตัวอย่างเช่นคุณมีชื่อแอตทริบิวต์เก็บไว้ในตัวแปรที่เรียกว่า
ถ้า
attr_name = 'gender'
จากนั้นแทนที่จะเขียน
gender = person.gender
คุณสามารถเขียน
gender = getattr(person, attr_name)
การปฏิบัติบางอย่าง:
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
จะเพิ่มAttributeError
หากไม่มีแอตทริบิวต์ที่มีชื่อที่กำหนดในวัตถุ:
>>> getattr(person, 'age')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'age'
แต่คุณสามารถส่งค่าเริ่มต้นเป็นอาร์กิวเมนต์ที่สามซึ่งจะถูกส่งกลับหากไม่มีแอตทริบิวต์ดังกล่าว:
>>> getattr(person, 'age', 0)
0
คุณสามารถใช้getattr
ร่วมกับdir
เพื่อวนซ้ำชื่อแอตทริบิวต์ทั้งหมดและรับค่า:
>>> 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
การใช้งานจริงสำหรับสิ่งนี้คือการค้นหาวิธีการทั้งหมดที่มีชื่อขึ้นต้นด้วยtest
และเรียกมันว่า
คล้ายกับgetattr
มีsetattr
ซึ่งจะช่วยให้คุณสามารถตั้งค่าแอตทริบิวต์ของวัตถุที่มีชื่อของมัน:
>>> setattr(person, 'name', 'Andrew')
>>> person.name # accessing instance attribute
'Andrew'
>>> Person.name # accessing class attribute
'Victor'
>>>