簡體   English   中英

Python OOP 分離一個類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM