NameError : 이름 'self'가 정의되지 않았습니다


144

왜 그런 구조

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

오류가 NameError: name 'self' is not defined있습니까?

답변:


159

기본 인수 값은 함수 정의시 평가되지만 self함수 호출시에만 사용 가능한 인수입니다. 따라서 인수 목록의 인수는 서로를 참조 할 수 없습니다.

인수로 기본 인수를 지정 None하고 코드에서 테스트를 추가 하는 일반적인 패턴입니다 .

def p(self, b=None):
    if b is None:
        b = self.a
    print b

4
위의 내용이 매우 예쁘지 않다고 생각하지만 (나는 잘 작동하는 루비에서 온 것입니다) 위의 내용은 실제로 해결 방법으로 작동합니다. 파이썬이 매개 변수 목록에서 자체를 사용할 수 없도록 선택하는 것은 여전히 ​​어색합니다.
shevy

2
@shevy : "self"는 파이썬에서 특별한 의미가 없으며 , 첫 번째 주장에서 전통적으로 선택된 이름 일뿐 입니다. "self"를 "me"또는 "x"로 바꿀 수도 있습니다.
Max

더 좋은 방법이 없습니까? self를 참조해야하는 12 개의 기본 인수를 취하는 함수가 있다면 실제로 12 개의 if 문이 필요합니까? 이것은 매우 어색합니다.
Richard J. Barbalace

16

'b'를 없음으로 설정하는 옵션이 필요한 경우 :

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b

6

Google을 통해 여기에 도착한 경우 클래스 함수에 첫 번째 매개 변수로 자신을 부여했는지 확인하십시오. 특히 함수 내에서 해당 객체의 값을 참조하려고하면.

def foo():
    print(self.bar)

> NameError : 이름 'self'가 정의되지 않았습니다

def foo(self):
    print(self.bar)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.