2011-11-15 3 views
22

메소드에 인스턴스 멤버의 기본 인수 값을 전달하는 방법은 무엇입니까?

인스턴스의 속성 값을 사용하여 인스턴스 메서드에 기본 인수를 전달하려면 :

class C: 
    def __init__(self, format): 
     self.format = format 

    def process(self, formatting=self.format): 
     print(formatting) 

시도 할 때 다음 오류 메시지가 나타납니다.

NameError: name 'self' is not defined 

메서드는 다음과 같이 동작합니다.

C("abc").process()  # prints "abc" 
C("abc").process("xyz") # prints "xyz" 

여기의 문제는 무엇입니까, 왜 이것이 작동하지 않습니까? 어떻게이 일을 할 수 있을까요?

+0

파이썬에서 내장 함수이기 때문에 변수 이름으로 형식을 사용하지 마십시오. – Yajushi

+0

'process method'에서'self'의 실수 편집하기 –

답변

31

인스턴스가 존재하기 전에 메서드가 정의 될 때 기본값이 계산되므로 실제로이 값을 기본값으로 정의 할 수 없습니다. 쉬운 해결 방법은 다음과 같이 일을 할 것입니다 : formattingNone 경우

class C: 
    def __init__(self, format): 
     self.format = format 

    def process(self, formatting=None): 
     formatting = formatting if formatting is not None else self.format 
     print(formatting) 

self.format

에만 사용됩니다.

def mk_default(): 
    print("mk_default has been called!") 

def myfun(foo=mk_default()): 
    print("myfun has been called.") 

print("about to test functions") 
myfun("testing") 
myfun("testing again") 

그리고 여기 출력 :


가 기본값이 작동하는 방법의 포인트를 설명하기 위해,이 예제를 참조

mk_default has been called! 
about to test functions 
myfun has been called. 
myfun has been called. 

mk_default가 한 번만 호출하고, 그 상황을 통지 함수가 호출되기 전에 일어났습니다!

+0

'moo_default'는 괄호 때문에'foo = mk_default()'가 호출 된 이후 함수가 호출되기 전에 호출 된 것 같습니다. 'foo = mk_default'가 아니어야합니까? 그럼 당신의 예제는'myfun ("testing")'myfun()'으로 바뀔 수 있습니다. – gary

+0

여전히 권장되는 해결 방법입니까? – confused00

+2

'formatting = formatting 또는 self.format'은'formatting'이 0과 같은 거짓 값일 경우'format.'을'self.format'로 설정합니다. 이것은 단지 나를 물 듭니다. 더 안전한 방법은'formatting = formatting is not else self.format' 또는 동등한 것이면'formatting = formatting '을 입력하는 것입니다. – Godsmith

6

파이썬에서 self의 이름은 이 아니고이 아닙니다. 매개 변수 이름에 대한 규칙 일 뿐이므로 __init__self 매개 변수가 있습니다. (사실, __init__ 중 하나 아주 특별한하지 않고, 특히이 하지 실제로 ... 그 긴 이야기 객체를 생성하지),

C("abc").process()C 인스턴스를 생성하는 C 클래스의 process 방법을 찾습니다, C 인스턴스를 첫 번째 매개 변수로 사용하여 해당 메서드를 호출합니다. 따라서 제공된 경우 self 매개 변수로 끝납니다.

비록이 매개 변수를 사용하더라도 self이 기본값을 설정하는 시점에 있지 않기 때문에 def process(self, formatting = self.formatting)과 같은 것을 쓸 수 없습니다. 파이썬에서 매개 변수의 기본값은 함수가 컴파일 될 때 계산되고 함수에 "고정"됩니다. (이것은 당신이 [] 같은 기본값을 사용하는 경우, 왜, 그 목록은 함수 호출 사이의 변화를 기억할 것 같은 이유입니다.)

가 어떻게이 일을 할 수 있을까?

전통적으로 None을 기본값으로 사용하여 해당 값을 확인하고 함수 내에서 바꿉니다.목적을 위해 특수 값을 만드는 것이 조금 더 안전 할 수 있습니다 (object 인스턴스는 None 대신 호출 코드가 동일한 인스턴스를 사용하지 않도록 숨길 수있는 한 모두 필요합니다). 어느 경우 든 is가 아닌 ==으로이 값을 확인해야합니다.

+0

해결 방법이 없음을 사용할 때 원하는 출력을 충족시키지 못합니다. –

+0

만약'None'이'formatting'에 유효한 값이라면, 제가 설명한 것처럼 다른 것을 골라야 할 것입니다. –

1

"self"가 비 정적 메서드로 동작하도록하려면 클래스 함수의 첫 번째 인수로 "self"를 전달해야합니다.

그것은 개체 자체를 나타냅니다. 위치가 첫 번째 인수로 수정되므로 기본 인수로 "self"를 전달할 수 없습니다.

대신 "형식 = self.format"사용 "형식 = 없음"의 사용자의 경우

다음 아래 코드에서 값을 할당합니다

[편집]

class c: 
     def __init__(self, cformat): 
      self.cformat = cformat 

     def process(self, formatting=None): 
      print "Formating---",formatting 
      if formatting == None: 
       formatting = self.cformat 
       print formatting 
       return formatting 
      else: 
       print formatting 
       return formatting 

c("abc").process()   # prints "abc" 
c("abc").process("xyz")  # prints "xyz" 

참고 : 사용하지 않는를 "형식"을 변수 이름으로 사용합니다. 왜냐하면 파이썬에서 내장 함수이기 때문입니다.

+0

글쎄, 나는 '자기'문제를 바로 잡았다. 그러나 당신의 대답은 원하는 출력을 만족시키지 못합니다. –

+0

편집 된 블록을 확인하면 도움이 될 것입니다. – Yajushi

관련 문제