python oop分离一堂课

发布于 2025-02-09 09:48:30 字数 3064 浏览 1 评论 0原文

我目前有一个名为Client的类,该类具有函数可以登录到网站并使用Python请求与该网站进行交互的功能。但是,我的登录功能有些复杂。我必须访问大约10个不同的端点,以收集正确的cookie才能登录。因此,我有10个不同的功能来收集所有这些使我的客户端类混乱的cookie。我还使用一个实例变量自我。每个请求的sessession,以自动将我的会话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



我想将功能中的日志分离为另一个类。我不确定是否应该只制作一个称为登录名的单独对象并将自我传递变量传递给该类别,或者是否应该以某种方式使登录继承从客户端继承。但是,在登录课程完成登录后,我需要返回客户与网站进行交互。我不确定这将是什么最好的方法。我最初想到以下类似的事情,但不确定继承是否会更好,甚至可能的选择。谢谢!

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

I currently have a class called Client that has functions to log in to a website and interact with it using python requests. However, my log in functionality is somewhat complicated. I have to visit about 10 different endpoints to collect the correct cookies just to log in. Therefore, I have 10 different functions for the log in process to gather all these cookies which is cluttering up my Client class. I'm also using an instance variable self.session for each request to automatically keep my session cookies updated to the latest request.

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



I would like to separate the log in functionality possibly into another class. I'm not sure if I should just make a separate object called LogIn and pass the self.session variable to that class, or if I should somehow make LogIn inherit from Client. But, after the LogIn class finishes logging in, I would need to go back to Client to interact with the site. I'm not sure what the best way of seperating this could would be. I was initially thinking of something like below, but not sure if inheritance would be a better , or even possible option. Thanks!

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

抹茶夏天i‖ 2025-02-16 09:48:31

很难准确地告诉您各种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!')

It's a little hard to tell exactly what differs in your various login_funcN functions, since you've simplified the problem a bit too much for your example. But if the only thing that needs to change between the different login efforts is the URL and headers, you might consider packing that data up separately in a data structure, rather than using separate functions for each step. The data can be stored separately from the rest of the class, and so you might not need a second class at all (just a data structure to hold the login data).

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!')
箜明 2025-02-16 09:48:30

您的继承想法似乎是一个很好的方法。

我建议让登录类从会话中继承,这样您就可以使用它来创建会话并通过所需的登录功能自定义它:

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)

Your idea of inheritance seems to be a good approach.

I would propose to let the LogIn class inherit from Session, this way you can use it to create the Session and customize it via your desired login functionality:

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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文