복붙노트

[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. ==============================

    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. ==============================

    2.파이썬에서 self라는 이름은 특별한 것이 아닙니다. 매개 변수 이름에 대한 규칙 일 뿐이므로 __init__에 자체 매개 변수가 있습니다. (사실, __init__은 그다지 특별한 것이 아니며, 실제로 객체를 생성하지는 않습니다 ... 그것은 더 긴 이야기입니다)

    파이썬에서 self라는 이름은 특별한 것이 아닙니다. 매개 변수 이름에 대한 규칙 일 뿐이므로 __init__에 자체 매개 변수가 있습니다. (사실, __init__은 그다지 특별한 것이 아니며, 실제로 객체를 생성하지는 않습니다 ... 그것은 더 긴 이야기입니다)

    C ( "abc"). process ()는 C 인스턴스를 만들고 C 클래스에서 프로세스 메서드를 찾고 C 인스턴스를 첫 번째 매개 변수로 사용하여 해당 메서드를 호출합니다. 그래서 당신이 그것을 제공한다면 그것은 자기 매개 변수에서 끝날 것입니다.

    비록 그 매개 변수를 가지고 있다고 할지라도, def 프로세스 (self, formatting = self.formatting)와 같은 것을 쓰는 것은 허용되지 않을 것입니다. 왜냐하면 self는 기본값을 설정하는 시점에서 아직 범위에 있지 않기 때문입니다. 파이썬에서 매개 변수의 기본값은 함수가 컴파일 될 때 계산되고 함수에 "고정"됩니다. (이것은 []와 같은 기본값을 사용하면 함수 호출 간의 변경 사항을 기억하는 것과 같은 이유입니다.)

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

  3. ==============================

    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"을 사용하지 마십시오. 왜냐하면 파이썬에서 내장 함수이기 때문입니다.

  4. 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