Python 从类内部调用常规函数?

Python 从类内部调用常规函数?,python,Python,我是Python新手,我有一个接受API参数的工厂类,在我的设置中,我得到了一个NameError:“self”没有定义。我知道我的函数调用是错误的。我将如何重构它以获得相同的逻辑 import requests import json class Call: results = [] __response = None __methods= dict(post=self.__post(), get=self.__get()) def __init__(s

我是Python新手,我有一个接受API参数的工厂类,在我的设置中,我得到了一个NameError:“self”没有定义。我知道我的函数调用是错误的。我将如何重构它以获得相同的逻辑

import requests
import json

class Call:

    results = []
    __response = None
    __methods= dict(post=self.__post(), get=self.__get())


    def __init__(self, root, endpoint, payload, header):
        self.__root = root
        self.__endpoint = endpoint
        self.__payload = payload
        self.__header = header

    def __post(self):

       self.__response = requests.post(
            self.__root + self.__endpoint, 
            data = json.dumps(self.__payload), 
            headers = self.__header
        )

       self.__get_results()

    def __get(self):

       self.__response = requests.get(
            self.__root + self.__endpoint, 
            data = json.dumps(self.__payload), 
            headers = self.__header
        )

       self.__get_results()

    def __get_results(self):

        if (self.__response.ok):
            data = json.loads(self.__response.content)
            results.append(
                {
                    'result':data['result'], 
                    'endpoint': self.__endpoint, 
                    'status' : response.status_code
                }
            ) 
        else:
            results.append(
                {
                    'result':'FAILED', 
                    'endpoint': self.__endpoint, 
                    'status' : response.status_code
                }
            )

    def method(self, method):
        return self.__methods[method]

login = Call(
    Url.V1_PROD, 
    DriverEndpoint.LOGIN, 
    DriverPayload.LOGIN, 
    Request.HEADER
)

login.method('post')
您的
\u方法
变量是类变量,
self
用于引用
调用
的实例,self无法访问类变量范围

您可以将
\u方法
声明为实例变量:

def __init__(self):
    self.__methods= dict(post=self.__post(), get=self.__get())

def get_mothods(self):
    return self.__methods
您的
\u方法
变量是类变量,
self
用于引用
调用
的实例,self无法访问类变量范围

您可以将
\u方法
声明为实例变量:

def __init__(self):
    self.__methods= dict(post=self.__post(), get=self.__get())

def get_mothods(self):
    return self.__methods

您不应该使用以双下划线开头的变量名,它们用于调用名称混乱,您可能不希望这样。 使用一个下划线

使用
\uuuu init\uuuu
方法在实例上声明字典更容易。 一种常见的替代方法是将要调用的方法的名称存储为字符串,并使用
getattr
访问这些方法(请参阅)


您不应该使用以双下划线开头的变量名,它们用于调用名称混乱,您可能不希望这样。 使用一个下划线

使用
\uuuu init\uuuu
方法在实例上声明字典更容易。 一种常见的替代方法是将要调用的方法的名称存储为字符串,并使用
getattr
访问这些方法(请参阅)


请发布完整的回溯。请发布完整的回溯。我使用双下划线的目的是使它们对类是私有的。这不是在遵循最佳实践吗?有关_;的讨论,请参阅。简短回答:不要用那个。单下划线是一种约定,表示方法/属性用于类的内部使用,或者不应该从类外部使用,或者将来可能会更改。。。。在您的代码中,没有特别的理由不应该直接使用其中的一些(例如,post,as method('post'))除了调用postmy外,我什么都不做。双下划线的目的是使它们对类私有。这难道不是遵循最佳实践吗?请参阅,以了解关于_u;的讨论。简短回答:不要使用它。单下划线是一种约定,意味着方法/属性用于类的内部使用,或者不应该用于类的内部使用在你的代码中,没有特别的理由不应该直接使用其中的一些(比如post,因为方法('post')除了调用post之外什么都不做)
import requests
import json

class Call:

    results = []
    _response = None


    def __init__(self, root, endpoint, payload, header):
        self._root = root
        self._endpoint = endpoint
        self._payload = payload
        self._header = header
        # NO () after self._post, otherwise it would call the
        # method and insert the return value in the dict
        self._methods= dict(post=self._post, get=self._get)

    def _post(self):

       self._response = requests.post(
            self._root + self._endpoint, 
            data = json.dumps(self._payload), 
            headers = self._header
        )

       self._get_results()

    def _get(self):

       self._response = requests.get(
            self._root + self._endpoint, 
            data = json.dumps(self._payload), 
            headers = self._header
        )

       self._get_results()

    def _get_results(self):

        if (self.__response.ok):
            data = json.loads(self.__response.content)
            results.append(
                {
                    'result':data['result'], 
                    'endpoint': self._endpoint, 
                    'status' : response.status_code
                }
            ) 
        else:
            results.append(
                {
                    'result':'FAILED', 
                    'endpoint': self._endpoint, 
                    'status' : response.status_code
                }
            )



    def method(self, method):
        # Here, we have to effectively call the selected method,
        # hence the () at the end
        self._methods[method]()

login = Call(
    Url.V1_PROD, 
    DriverEndpoint.LOGIN, 
    DriverPayload.LOGIN, 
    Request.HEADER
)

login.method('post')