getattr
— это встроенная функция, принимающая (как минимум) два аргумента: объект, из которого вы получаете атрибут, и строковое имя атрибута.
Если имя строки является константой, скажем, 'foo'
, getattr(obj, 'foo')
точно то же самое, что и obj.foo
.
Таким образом, основной вариант использования встроенной функции getattr
— это когда у вас есть имя атрибута не как константа, а как переменная. Второй важный вариант использования — это когда вы передаете ему три аргумента, а не только два: в этом случае, если атрибут отсутствует в объекте, getattr
возвращает третий аргумент «по умолчанию», а не вызывает исключение.
__getattr__
— это специальный метод, определенный в классе, который вызывается, когда запрашивается какой-либо атрибут экземпляра этого класса, и другие обычные способы предоставления этого атрибута (через __dict__
экземпляра, слоты, свойства и т. д.) не увенчались успехом. . Вы можете определить его, например, когда хотите делегировать другим объектам поиск атрибутов, которые в противном случае не определены.
Таким образом, ваш второй пример неверен, потому что встроенная функция getattr
никогда не может быть вызвана с одним аргументом.
Третий терпит неудачу, потому что словарь, из которого вы пытаетесь «получить атрибут», не имеет этого атрибута — в нем есть элементы, которые, конечно, полностью не пересекаются с атрибутами.
person
Alex Martelli
schedule
22.12.2009