Python 从类内部调用常规函数?
我是Python新手,我有一个接受API参数的工厂类,在我的设置中,我得到了一个NameError:“self”没有定义。我知道我的函数调用是错误的。我将如何重构它以获得相同的逻辑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
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')