Python:每个函数呼叫的新对象实例



我正在尝试使用会话令牌和用户ID更新基础类,以进行长时间的轮询。

每次我调用我的功能时,我都会创建一个新实例,该实例称为登录函数,我不想发生。

我只想在值为 None

时调用login()方法

在会话令牌设置为get_balance ??

的函数之后,如何返回Apiclient的实例

client.py

from __future__ import absolute_import, unicode_literals
import requests
import os
from matchbook import endpoints
class BaseClient(object):
    def __init__(self, username, password=None, locale=None):
        self.username = username
        self.password = password
        self.locale = locale
        self.url_beta = 'https://beta.matchbook.com'
        self.urn_main = '/bpapi/rest/'
        self.session = requests.Session()
        self.session_token = None
        self.user_id = None  
    def set_session_token(self, session_token, user_id):
        self.session_token = session_token
        self.user_id = user_id
class APIClient(BaseClient):
    def __init__(self, username, password=None):
        super(APIClient, self).__init__(username, password)
        self.login = endpoints.Login(self)
        self.account = endpoints.Account(self)
    def __repr__(self):
        return '<APIClient [%s]>' % self.username
    def __str__(self):
        return 'APIClient' 

get_bal.py

from client import APIClient
from celery import shared_task
def get_client():
    apiclient = APIClient(username, password)
    if apiclient.session_token is None:
        apiclient.login()
        session_token = apiclient.session_token
        user_id = apiclient.user_id
        apiclient.set_session_token(session_token,user_id)
    else:
        print('session token assigned',apiclient.session_token, apiclient.user_id)
    return apiclient
@shared_task
def get_balance():
    apiclient = get_client() *to call instance after login is set*
    r = apiclient.account.get_account()
    print(r)

您每次调用get_client()时都创建APIClient的新实例,这是每次get_balance()都会发生的情况。

您需要在功能范围之外维护APIClient的实例,以便您进行程序并更新您的get_balance(),以免每次致电get_client()

def get_balance(apiclient):
    r = apiclient.account.get_account()
    print(r)
def main():
    apiclient = get_client()
    get_balance(apiclient)  # pass instance of APIClient in as an argument

get_client()功能中的另一个注释,因为两个if条件彼此相反,只需将它们包装在if... else块中:

def get_client():
    apiclient = APIClient(username, password)
    if apiclient.session_token is None:
        apiclient.login()
        session_token = apiclient.session_token
        user_id = apiclient.user_id
        apiclient.set_session_token(session_token,user_id)
    else:
        print('session token assigned',apiclient.session_token, apiclient.user_id)
    return apiclient

所有话虽如此,更多的方法是将get_balance()烘烤到APIClient中作为实例方法,因此您甚至不需要担心实例:

class APIClient(BaseClient):
    ...
    def get_balance(self):
        print(self.account.get_account())
# Then just call the get_balance() anywhere:
apiclient = get_client()
apiclient.get_balance()

相关内容

  • 没有找到相关文章

最新更新