Объекты в 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'
>>>
Этот веб-сайт проверяет, установлен ли реферер при перенаправлении. Вы можете просто указать исходный URL в качестве реферера в заголовке и легко обойти это. Вы также можете видеть, что referer используется в качестве параметра url в окончательной ссылке для скачивания.
import requests
from bs4 import BeautifulSoup
s = requests.Session()
url='https://scanlibs.com/neural-networks-systems-evolutionary-algorithms-2nd/'
r=html=s.get(url).text
soup=BeautifulSoup(html,'html.parser')
relative_link=soup.find('a',{'id':'download'})['href'] #get the relative link
download_redirect_link=url+relative_link
headers={
"referer": url
}
r2=requests.get(download_redirect_link,headers=headers)
print(r2.url)
Выход
https://rapidgator.net/file/80e881f7631eddb49de31e5718eb96ba?referer=https://scanlibs.com/neural-networks-systems-evolutionary-algorithms-2nd/