python oop分离一堂课
我目前有一个名为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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
很难准确地告诉您各种
login_funcn
函数中有什么区别,因为您已经简化了问题过多。但是,如果唯一需要在不同的登录工作之间进行更改的是URL和标题,则可以考虑将数据分开包装在数据结构中,而不是为每个步骤使用单独的功能。数据可以与全班其余部分分开存储,因此您可能根本不需要第二类(只是数据结构来保存登录数据)。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).您的继承想法似乎是一个很好的方法。
我建议让登录类从会话中继承,这样您就可以使用它来创建会话并通过所需的登录功能自定义它:
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: