Чтобы написать много HTTP-запросов сухим способом, я хотел бы определить несколько подклассов requests сеансов и наследовать их при необходимости. Я попробовал следующее:Использование super() для наследования нескольких сеансов в запросах Python
import requests, time
requestbin_URL = 'http://requestb.in/1nsaz9y1' # For testing only; remains usable for 48 hours
auth_token = 'asdlfjkwoieur182932385' # Fake authorization token
class AuthorizedSession(requests.Session):
def __init__(self, auth_token):
super().__init__()
self.auth_token = auth_token
self.headers.update({'Authorization': 'token=' + self.auth_token})
class JSONSession(requests.Session):
def __init__(self):
super().__init__()
self.headers.update({'content-type': 'application/json'})
class DebugSession(requests.Session):
def __init__(self, verify=False):
super().__init__()
self.verify = verify
class AuthorizedJSONDebugSession(AuthorizedSession, JSONSession, DebugSession):
def __init__(self, auth_token, verify=False):
super().__init__(auth_token, verify=verify)
with AuthorizedJSONDebugSession() as s:
response = s.post(requestbin_URL, data={"key" : "value"})
Однако, если я пытаюсь запустить этот (в Python 3), я получаю
In [9]: exec(open('requestbin_test_python3.py').read())
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-cc670860ddd1> in <module>()
----> 1 exec(open('requestbin_test_python3.py').read())
<string> in <module>()
TypeError: __init__() missing 1 required positional argument: 'auth_token'
То, что я надеялся, что super().__init__
применительно к AuthorizedJSONDebugSession
будет «достаточно умный», чтобы понять, что auth_token
используется для инициализации AuthorizedSession
и verify
для инициализации DebugSession
. (Аналогичный пример, используя только AuthorizedSession
и JSONSession
сделал произведение).
Однако, похоже, это не так. Как я могу изменить этот код, чтобы он работал?
Вы можете использовать kwargs всюду, чтобы дать каждому суперклассу необходимый ему параметр, но я бы избавился от множественного наследования все вместе. Обычно он превращается в неприятный источник ошибок. – solarc
Множественное наследование сложнее в лучшем случае, и лучше всего использовать «один базовый класс + пару миксинов». –