[英]Python OOP Seperating a Class
我目前有一個名為 Client 的類,它具有登錄網站並使用 python 請求與之交互的功能。 但是,我的登錄功能有些復雜。 我必須訪問大約 10 個不同的端點來收集正確的 cookie 才能登錄。因此,我有 10 個不同的函數用於登錄過程來收集所有這些 cookie,這些 cookie 使我的 Client 類變得混亂。 我還為每個請求使用了一個實例變量 self.session 來自動將我的會話 cookie 更新為最新的請求。
class Client:
def __init__(self):
self.session = requests.Session()
def login_func1(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func2(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func3(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func4(self, url, headers):
resp = self.session.get(url, headers=headers)
..........
def login_func10(self, url, headers):
resp = self.session.get(url, headers=headers)
def login(self, url, headers, username, password):
self.loginin_func1(url, header)
self.loginin_func2(url, header)
self.loginin_func3(url, header)
self.loginin_func4(url, header)
......
self.loginin_func10(url, header)
resp = self.session.get(url, payload = {'user':username, 'password':password}, headers=headers)
if resp.status_code == 200:
print('Successfully logged in!')
def get_images(self, url, headers):
#get images code here
def get_table_data(self, url, headers):
#get table data code here
我想將登錄功能可能分離到另一個類中。 我不確定我是否應該只創建一個名為 LogIn 的單獨對象並將 self.session 變量傳遞給該類,或者我是否應該以某種方式使 LogIn 從 Client 繼承。 但是,在 LogIn 類完成登錄后,我需要返回客戶端與站點進行交互。 我不確定分離它的最佳方法是什么。 我最初在考慮類似下面的內容,但不確定繼承是否會更好,甚至可能的選擇。 謝謝!
from login import LogIn
class Client:
def __init__(self):
self.session = requests.Session()
def login(self, url, headers):
self.session = LogIn(self.session).login(url, headers, username, password)
def get_images(self, url, headers):
//get images code here
def get_table_data(self, url, headers):
//get table data code here
class LogIn:
def __init__(self, session):
self.session = session
def login_func1(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func2(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func3(self, url, headers):
resp = self.session.get(url, headers=headers)
def login_func4(self, url, headers):
resp = self.session.get(url, headers=headers)
..........
def login_func10(self, url, headers):
resp = self.session.get(url, headers=headers)
def login(self, url, headers, username, password):
self.loginin_func1(url, header)
self.loginin_func2(url, header)
self.loginin_func3(url, header)
self.loginin_func4(url, header)
......
self.loginin_func10(url, header)
resp = self.session.get(url, payload = {'user':username, 'password':password}, headers=headers)
if resp.status_code == 200:
print('Successfully logged in!")
return self.session
您的繼承想法似乎是一個好方法。
我建議讓 LogIn 類從 Session 繼承,這樣您就可以使用它來創建 Session 並通過所需的登錄功能對其進行自定義:
class Client:
def __init__(self):
self.session = LoginSession()
def login(self, url, headers, username, password):
self.session.login(url, headers, username, password)
class LoginSession(requests.Session):
def login(self, url, headers, username, password):
self.login_func1(url, headers)
# [...]
self.login_func10(url, headers)
resp = self.get(
url, payload={"user": username, "password": password}, headers=headers
)
if resp.status_code == 200:
print("Successfully logged in!")
def login_func1(self, url, headers):
resp = self.get(url, headers=headers)
# [...]
def login_func10(self, url, headers):
resp = self.get(url, headers=headers)
很難准確地說出您的各種login_funcN
函數有什么不同,因為對於您的示例而言,您已經將問題簡化得太多了。 但是,如果在不同的登錄工作之間唯一需要更改的是 URL 和標頭,您可能會考慮將這些數據單獨打包到數據結構中,而不是為每個步驟使用單獨的函數。 數據可以與類的其余部分分開存儲,因此您可能根本不需要第二個類(只是一個保存登錄數據的數據結構)。
cookie_gathering_data = [(cookie_url1, cookie_headers1),
(cookie_url2, cookie_headers2),
...]
class Client:
def login(self, cookie_data, url, headers, username, password):
for cookie_url, cookie_headers in cookie_data:
self.session.get(cookie_url, headers=cookie_headers)
resp = self.session.get(url, payload={'user':username, 'password':password},
headers=headers)
if resp.status_code == 200:
print('Successfully logged in!')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.