Автоматическая настройка столбцов в режиме отображения сетки с максимальным количеством столбцов

Объекты в Python могут иметь атрибуты (фактически, каждый объект имеет встроенные атрибуты - атрибуты данных и методы (функции - это значения, т. е. объекты), чтобы работать с ними). ​​

Например у вас есть объект person, который имеет несколько атрибутов: name, gender и т. д.

Доступ к этим атрибутам (будь то методы или объекты данных) обычно записывается: person.name, person.gender, person.the_method() и т. д.

Но что, если вы не знаете имя атрибута в момент написания программы? Например, у вас есть имя атрибута, хранящееся в переменной под названием attr_name.

, если

attr_name = 'gender'

, вместо записи

gender = person.gender

вы можете write

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, если атрибут с заданным именем не существует в object:

>>> getattr(person, 'age')
Traceback (most recent call last):
  File "", line 1, in 
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__  True
...
bit_length  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'
>>>

0
задан Evil Closet Monkey 13 July 2018 в 20:35
поделиться