2017-02-17 67 views
0

我是新来的Python和我有工厂类,它的API参数,并与我的设置我得到一个NameError:“自我”没有定义。我明白我的函数调用是错误的。我将如何重构这个具有相同的逻辑从课堂内部调用常规功能?

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') 
+1

请张贴完整的回溯。 – wwii

回答

0
__methods= dict(post=self.__post(), get=self.__get()) 

__methods变量类变量,self被用来指的Call一个实例,自不能访问到类变量的作用域。

你可以声明__method作为一个实例变量:

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

def get_mothods(self): 
    return self.__methods 
2

你不应该使用开始用__double __underscore变量名,它们被用来调用名字改编,你可能不希望。 使用_single _underscore。

它更容易声明你的字典上的实例,在__init__方法。 常见的替代方法是存储你想打电话,为字符串方法的名称,并使用getattr访问方法(见Call a Python method by name)。

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') 
+0

我的双下划线的意图是让他们对班级保密。这不符合最佳实践吗? – teddybear123

+0

看到http://stackoverflow.com/questions/6930144/underscore-vs-double-underscore-with-variables-and-methods为__的讨论。 简短的回答:不要使用它。单下划线是* *惯例,这意味着,该方法/属性是类的内部使用,或不应该被从类的外部使用,或者,它可能在未来改变....在你的代码,没有什么特别的理由可以说明为什么一个人不应该直接使用他们中的一些(比如post,例如,由于方法('post')除了调用post之外什么也不做) –