[PYTHON] 메소드에 인스턴스 멤버의 기본 인수 값을 전달하는 방법은 무엇입니까?
PYTHON메소드에 인스턴스 멤버의 기본 인수 값을 전달하는 방법은 무엇입니까?
인스턴스의 속성 값을 사용하여 인스턴스 메소드에 기본 인수를 전달하려고합니다.
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"
왜 여기에 문제가 있는데, 왜 이것이 작동하지 않습니까? 어떻게이 일을 할 수 있을까요?
해결법
-
==============================
1.인스턴스가 존재하기 전에 메서드가 정의 될 때 기본값이 평가되기 때문에이 값을 기본값으로 실제로 정의 할 수 없습니다. 쉬운 해결 방법은 다음과 같이하는 것입니다.
인스턴스가 존재하기 전에 메서드가 정의 될 때 기본값이 평가되기 때문에이 값을 기본값으로 실제로 정의 할 수 없습니다. 쉬운 해결 방법은 다음과 같이하는 것입니다.
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)
format이 None 일 때만 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가 한 번만 호출되었고 함수가 호출되기 전에 어떻게 발생했는지 주목하십시오!
-
==============================
2.파이썬에서 self라는 이름은 특별한 것이 아닙니다. 매개 변수 이름에 대한 규칙 일 뿐이므로 __init__에 자체 매개 변수가 있습니다. (사실, __init__은 그다지 특별한 것이 아니며, 실제로 객체를 생성하지는 않습니다 ... 그것은 더 긴 이야기입니다)
파이썬에서 self라는 이름은 특별한 것이 아닙니다. 매개 변수 이름에 대한 규칙 일 뿐이므로 __init__에 자체 매개 변수가 있습니다. (사실, __init__은 그다지 특별한 것이 아니며, 실제로 객체를 생성하지는 않습니다 ... 그것은 더 긴 이야기입니다)
C ( "abc"). process ()는 C 인스턴스를 만들고 C 클래스에서 프로세스 메서드를 찾고 C 인스턴스를 첫 번째 매개 변수로 사용하여 해당 메서드를 호출합니다. 그래서 당신이 그것을 제공한다면 그것은 자기 매개 변수에서 끝날 것입니다.
비록 그 매개 변수를 가지고 있다고 할지라도, def 프로세스 (self, formatting = self.formatting)와 같은 것을 쓰는 것은 허용되지 않을 것입니다. 왜냐하면 self는 기본값을 설정하는 시점에서 아직 범위에 있지 않기 때문입니다. 파이썬에서 매개 변수의 기본값은 함수가 컴파일 될 때 계산되고 함수에 "고정"됩니다. (이것은 []와 같은 기본값을 사용하면 함수 호출 간의 변경 사항을 기억하는 것과 같은 이유입니다.)
전통적인 방법은 None을 기본값으로 사용하고 해당 값을 확인하고 함수 내에서 바꿉니다. 목적을위한 특별한 가치를 만드는 것이 조금 더 안전 할 수 있습니다 (객체 인스턴스는 호출 코드가 같은 인스턴스를 사용하지 않도록 숨길 수있는 한 모두 필요합니다). 어느 쪽이든, ==가 아닌 is를 사용하여이 값을 확인해야합니다.
-
==============================
3."self"는 비 정적 메서드로 동작하도록하려면 클래스 함수의 첫 번째 인수로 전달해야합니다.
"self"는 비 정적 메서드로 동작하도록하려면 클래스 함수의 첫 번째 인수로 전달해야합니다.
그것은 객체 자체를 참조합니다. 위치가 첫 번째 인수로 수정되므로 기본 인수로 "self"를 전달할 수 없습니다.
"formatting = self.format"대신에 "formatting = None"을 사용하고 코드에서 다음과 같이 값을 할당하십시오.
[편집하다]
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"
참고 : 변수 이름으로 "format"을 사용하지 마십시오. 왜냐하면 파이썬에서 내장 함수이기 때문입니다.
from https://stackoverflow.com/questions/8131942/how-to-pass-a-default-argument-value-of-an-instance-member-to-a-method by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 사용자 정의 팝업 tkinter 대화 상자를 구현하는 올바른 방법 (0) | 2018.10.04 |
---|---|
[PYTHON] for 중첩 된 루프 방지하기 (0) | 2018.10.04 |
[PYTHON] __eq__는 파이썬에서 어떤 순서로 처리됩니까? (0) | 2018.10.04 |
[PYTHON] ImportError : _ssl이라는 모듈이 없습니다. (0) | 2018.10.04 |
[PYTHON] 파이썬 클래스를 복사하는 방법? (0) | 2018.10.04 |