2013-03-05 1 views
0

저는 파이썬을 처음 접했지만 마음에 들었습니다. 첫 번째 Python 프로젝트를 시작하고 프로토 타이핑을하고 있습니다. "Python 철학"은 타이핑과 예외에 관해 나를 혼란스럽게합니다. 누군가이 발췌 부분에서 촬영할 수 있습니까? 기본적인 파이썬 방법론을 엔지니어링하거나 누락 했나요?파이썬 클래스 강화 또는 엔지니어링

class URIPartError(Exception): 
pass 

class WCFClient(object): 
def __init__(self, host, scheme='http', port=80, path='/', user=None, password=None): 
    super(WCFClient, self).__init__() 

    #Store our variables 
    try: 
     self.__host = str(host).lower() 
     self.__scheme = str(scheme).lower() 
     self.__port = int(port) 
     self.__path = str(path) 
     self.__user = str(user) if user else None 
     self.__password = str(password) if password else None 
    except (TypeError, ValueError), e: 
     raise URIPartError('Invalid URI part') 

    #Are our inputs valid? 
    if not self.__scheme == 'http' and not self.__scheme == 'https': 
     raise URIPartError('Invalid URI scheme') 
    if not path.startswith('/') or not path.endswith('/'): 
     raise URIPartError('Invalid URI path') 

    #Generate valid URI for baseurl 
    if (self.__scheme == 'http' and self.__port == 80) or (self.__scheme == 'https' and self.__port == 443):  
     self.__baseurl = '{0}://{1}{2}'.format(self.__scheme, self.__host, self.__path) 
    else: 
     self.__baseurl = '{0}://{1}:{2}{3}'.format(self.__scheme, self.__host, self.__port, self.__path) 

def baseurl(self): 
    return self.__baseurl 

고마워요! , 정말 이해가되지 않습니다 (파이썬 2.x를 사용하는 경우 BTW에만 파이썬 3이 기본이기 때문에, 의미가 있습니다) object에서 WCFClient 상속이 object 클래스의 생성자를 호출하는 방법으로보고

+0

나를 잘 보입니다. – Denis

+0

나에게 단단한 것처럼 보입니다! – msvalkon

+3

괜찮아 보이는군요. 비록 당신의 속성에 이중 밑줄 이름을 사용하는 것을 다시 생각해 보길 권합니다. 이러한 속성은 하위 클래스에서 액세스 할 수 없으므로 클래스를 확장하는 것이 어려워집니다. 이들을 "개인용"으로 표시 할 필요가있는 경우 맨 앞에 하나의 밑줄을 사용하십시오. 비공개로 표시하는 특별한 이유가 없으면하지 말고 밑줄없이 일반 이름을 지정하십시오. – BrenBarn

답변

3

입니다 나머지 라인

super(WCFClient, self).__init__() 

을 제거 할 수 있다는 것을 의미 타이핑의 측면에서 잘못된 것이 없다. 유형을 고집하지 않고 값을 확인하여 정확하게 작업하고 있습니다. 사용자가 잘못된 매개 변수를 전달하면 예외를 발생시키는 것이 타당합니다.

내가 여기 작성한 유일한 의견은 getter와 함께 "개인"두 개의 밑줄 변수를 사용하는 것이 매우 불리하다는 점입니다. self.__baseurl을 설정하고 baseurl() 방법을 제공하는 대신 self.baseurl을 직접 설정하십시오.

+0

에 대해 읽어 볼 것입니다. "유향없는 방법"은 정확하게 파이썬에 관해서 부족한 것입니다. 시간이 지남에 따라 올 것입니다. 감사. 당신의 대답을 보는 것이 내가 당신을 받아들이겠습니까? 감사 – Berdus

0

. 이것은 당신이 모든 확인 :

+0

MRO가 어떤 하위 클래스 인'WFCClient '에 대해 어떻게 해결 될지 알 수 없습니다. 예를 들어, MRO의 다음 '__init__'이 형제 클래스 일 수 있습니다.이 경우에는'super'가 절대적으로 필요합니다. –

+0

MRO의 다음 클래스는'object' 일 필요는 없지만 전달할 인수 /'** kwds'가 없으므로 여기에 아마 맞을 것입니다. [Python의 super() super!] (http://rhettinger.wordpress.com/2011/05/26/super-considered-super)를 보라. – eryksun

+0

뭔가가 없거나'class WCFClient (object)'가 명시 적으로 수퍼 클래스가 무엇인지 명시하고 있지 않습니까? 즉, MRO는 'WCFClient'이고, 바로 뒤,'object'입니다. 'object'에 대해'__init__'를 호출하면 아무 것도 변경되지 않습니다. – alegen

관련 문제