2016-11-15 63 views
0

所以我一直在試圖理解一個類常量的用法,但我沒有看到如何覆蓋它。如果我的圖書館是這樣的:導入時覆蓋常量

class ArcsightLogger(object): 
    """ 
    Main Class to interact with Arcsight Logger REST API 
    """ 

    TARGET = 'https://SOMETHING:9000' 

    def __init__(self, username, password, disable_insecure_warning=False): 
     """ 
     Log in the user whose credentials are provided and 
     store the access token to be used with all requests 
     against Arcsight 
     """ 

     action = 'ignore' if disable_insecure_warning else 'once' 
     warnings.simplefilter(action, InsecureRequestWarning) 
     r = self._post(
      '/core-service/rest/LoginService/login', data={ 
       'login': username, 
       'password': password, 
      }, is_json=False) 
     r.raise_for_status() 
     loginrequest = untangle.parse(r.content) 
     self.token = loginrequest.ns3_loginResponse.ns3_return.cdata 

    def format_time(self, *args): 
     currentdt = datetime.datetime.now(pytz.utc) 
     if len(args) > 0: 
      currentdt += datetime.timedelta(*args) 
     (dt, micro) = currentdt.strftime('%Y-%m-%dT%H:%M:%S.%f').split('.') 
     tz_offset = currentdt.astimezone(tzlocal()).strftime('%z') 
     tz_offset = "Z" if tz_offset == "" else tz_offset[:3] + ":" + tz_offset[3:] 

     dt = "%s.%03d%s" % (dt, int(micro)/1000, tz_offset) 
     return dt 

    def _post(self, route, data, is_json=True,): 
     """ 
     Post Call towards Arcsight Logger 
     :param route: API endpoint to fetch 
     :param is_json: Checks if post needs to be JSON 
     :param data: Request Body 
     :return: HTTP Response 
     """ 

     if not data: 
      return 

     url = self.TARGET + route 
     if is_json: 
      return requests.post(url, json=data, verify=False) 
     else: 
      return requests.post(url, data, verify=False) 

這一切正常,如果我手動設定的目標在這個腳本,但是當我導入到另一個腳本,像這樣:

import arcsightrest 

arcsight = arcsightrest.ArcsightLogger('admin', 'somepassword', False) 
arcsight.TARGET = 'https://10.10.10.10:9000' 
with arcsight.search('query') as search: 
    search.wait() 
    data = search.events(custom=True) 
    print data 

然後當我運行劇本,我看到這個目標是從來沒有真正覆蓋,因爲回溯還是說,它正在使用此調用的初始化功能是舊的目標(這要求彥博):

Traceback (most recent call last): 
    File "test.py", line 3, in <module> 
    arcsight = arcsightrest.ArcsightLogger('admin', 'somepassword', False) 
    File "/var/www/Projects2/ArcsightSDK/arcsightrest.py", line 37, in __init__ 
    }, is_json=False) 
    File "/var/www/Projects2/ArcsightSDK/arcsightrest.py", line 69, in _post 
    return requests.post(url, data, verify=False) 
    File "/usr/lib/python2.7/site-packages/requests/api.py", line 110, in post 
    return request('post', url, data=data, json=json, **kwargs) 
    File "/usr/lib/python2.7/site-packages/requests/api.py", line 56, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 475, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 596, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/lib/python2.7/site-packages/requests/adapters.py", line 487, in send 
    raise ConnectionError(e, request=request) 
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='something', port=9000): Max retries exceeded with url: /core-service/rest/LoginService/login (Caused by NewConnectionError('<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x1e59e50>: Failed to establish a new connection: [Errno -2] Name or service not known',)) 

回答

1

要覆蓋可變創建它的實例

arcsight = arcsightrest.ArcsightLogger('admin', 'somepassword', False) 
#__init__ has been already done 

arcsight.TARGET = 'https://10.10.10.10:9000' 

所以在__init__功能有舊值。您需要通過既然你想爲不同的情況下使用實例變量,而不是一類變量使用不同的目標使用類而不是實例

import arcsightrest 

arcsightrest.ArcsightLogger.TARGET = 'https://10.10.10.10:9000' 
+0

你能解釋我在應該如何在創建實例之前定義這個變量?在創建實例之前,我嘗試添加'arcsightrest.TARGET ='https://10.10.10.10:9000'',但這沒有幫助。 – Marius

+0

檢查編輯 –

+0

這樣做的竅門,我想我在定義目標時忘了添加類。謝謝一堆! – Marius

1

改變變量。畢竟,如果它會發生變化,它並不是一個常量。

您可以在__init__()方法中傳遞URL目標的值。如果有一個合適的使用默認值:

class ArcsightLogger(object): 
    """ 
    Main Class to interact with Arcsight Logger REST API 
    """ 

    def __init__(self, username, password, disable_insecure_warning=False, target='https://SOMETHING:9000'): 
     self.target = target 
     # etc... 

_post()然後使用self.target

如果你不喜歡設定在__init__()方法的參數的默認值,那麼你可以定義默認值作爲一個類變量,並用它來初始化self.target

class ArcsightLogger(object): 
    """ 
    Main Class to interact with Arcsight Logger REST API 
    """ 

    TARGET = 'https://SOMETHING:9000' 

    def __init__(self, username, password, disable_insecure_warning=False, target=None): 
     self.target = target if target is not None else self.TARGET