2013-09-04 6 views
0

[업데이트] : 전체 코드파이썬 클래스 변수

난 항상 pyhton의 staticmethods 와 혼동하지만 this (마지막 응답)에 따르면, 작동합니다!

점점 오류 :

AttributeError: class MyConnection has no attribute 'myuser'

class MyConnection: 
    def __init__(self, hostname, port, user, password): 
     myhostname = hostname 
     myport = port 
     myuser = user 
     mypassword = password 
     isisessid = None 

    @staticmethod 
    def connect(): 
     my_session = MyConnection() 

     headers = {'content-type': 'application/json'} 
     headers['Authorization'] = 'Basic ' + string.strip(
      base64.encodestring(MyConnection.myuser + ':' + MyConnection.mypassword)) 

     body = json.dumps({'username': MyConnection.myuser, 'password': MyConnection.mypassword, 
      'services': ['platform', 'namespace']}) 

     uri = '/session/1/session' 

     connection = httplib.HTTPSConnection(MyConnection.myhostname, MyConnection.myport) 
     connection.connect() 

     try: 
      connection.request('POST', uri, body, headers) 
      response = connection.getresponse() 
      my_session.isisessid = MyConnection.extract_session_id(
       response.getheaders()) 
     except Exception, e: 
      print e 
      connection.close() 
     except httplib.BadStatusLine, e: 
      print e 
      connection.close() 

     return my_session 
+0

이 질문은 정적 방법과 관련이 없습니다. 오류가 귀하의'__init__'에 있습니다 : http://stackoverflow.com/a/18622179/429533 –

+0

@Peter : [OT] 스스로를 부탁하고 [요청]을 사용하십시오 (http://docs.python-requests.org /) – spinus

+0

@spinus : 제안에 감사드립니다. 내 코드가 아닙니다. 바퀴를 재발 명하지 않고 자동차를 만들려고 노력합니다! ;) – Peter

답변

2

속성이 정적 위하여려고하는 경우가 아니라 방법의 수준에서, 클래스 레벨에서 외부 그들에게 선언의 초기화 방법을 초기화하지 않습니다 .

하지만 이니셜 라이저에서 클래스 속성을 초기화하는 이유는 무엇입니까? 생성 한 모든 인스턴스는 값을 덮어 씁니다!

난 당신이 속성과 클래스 속성이 사용되는 것을 예를 혼동하고 생각합니다. 인스턴스 속성 만 사용하면 어떨까요? 모든 것을 고려하고 정적 데이터를 가지고있는 것은 이 아니고이 좋습니다. 예를 들어 :

class MyConnection: 
    def __init__(self, hostname, port, user, password): 
     self.myhostname = hostname 
     self.myport = port 
     self.myuser = user 
     self.mypassword = password 
    @staticmethod 
    def connect(): 
     my_session = MyConnection() 
     print my_session.myuser # just an example 
+0

"my_session = MyConnection()"클래스의 인스턴스를 생성하므로 변수를 가져와야합니다. 이씨 – Peter

1

당신은 (__init__에서) 클래스 범위의 속성 (정적 속성) 또는 인스턴스의 범위를 정의해야합니다. 인스턴스 범위에서

class Cls(object): 
    class_scope_attribute = 1 

    @staticmethod 
    def method1(): 
     print Cls.class_scope_attribute 

    @classmethod 
    def metdho2(cls): 
     print cls.class_scope_attribute 

    def method3(self): 
     print Cls.class_scope_attribute 
     print self.__class__.class_scope_attribute 

:

그래서 클래스 범위에서은과 같은 변수 이름 앞에 __init__에서 self에서

class Cls2(object): 
    def __init__(self): 
     self.instance_scope_attribute 

    @staticmethod 
    def method1(): 
     # cannot access the instance_scope_attribute 
     pass 

    @classmethod 
    def method2(cls): 
     # cannot access the instance_scope_attribute 
     pass 

    def method3(self): 
     print self.instance_scope_attribute 

봐.

따라서 self.을 추가하거나 변수를 클래스 범위로 이동해야하지만 클래스 범위 속성이 모든 인스턴스에서 공유되므로주의해야합니다.

0

목적은 connect@staticmethod를 만들기 위해 정말 경우에서와 같이, 클래스 레벨에서 myhostname, myport, myusermypassword를 초기화 : 또는

class MyConnection: 
     myhostname= hostnameValue 
     myport= portValue 
     myuser= userValue 
     mypassword= passwordValue 

     @staticmethod 
     def connect(): 
      my_session = MyConnection() 

      headers = {'content-type': 'application/json'} 
      headers['Authorization'] = 'Basic ' + string.strip(base64.encodestring(MyConnection.myuser + ':' + MyConnection.mypassword)) 

      body = json.dumps({'username': MyConnection.myuser, 'password': MyConnection.mypassword,'services': ['platform', 'namespace']}) 

      my_session.connection = httplib.HTTPSConnection(MyConnection.myhostname, MyConnection.myport) 
      my_session.connection.connect() 

    MyConnection.connect() 

, 당신이 None에 그대로두고 줄 수 그 (것)들에게 connect()를 부르기 전에 가치.

connect을 인스턴스 메소드로 만들려면 꽤 많이 있습니다. 장식 자 @staticmethod을 제거하고 몇 가지 다른 변경 작업을 수행하면됩니다.