2013-10-12 2 views
3

여기에 내가 대화 형 파이썬 세션을 입력 한 후 상황지역 변수

class Person(object): 
    NumRid = 1 
    def __init__(self, name, rid = NumRid): 
     self.name = name 
     self.rid = rid 
     NumRid += 1 

class Investor(Person): 
    pass 

및 유형 from file import * 에서 다음 투자자 ('밥') 그리고 그것은 하더군요 로컬 변수 NumRid는 할당 전에 NumRid += 1에서 참조됩니다.

Google 검색에서 알 수있는 한 NumRid는 클래스의 로컬 네임 스페이스에 있어야하며 클래스 기능에서 액세스 할 수 있어야합니다 .... 그럼이게 뭐야? 나는 둘 다 지구 적으로 선언 할 필요가 있는가? 또는 클래스 네임 스페이스의 NumRid를 찾도록 입력 할 수있는 마법의 단어가 있습니까?

+1

'UnboundLocal' 질문은 여기에 일주일에 두 번 묻습니다. 검색 및 점수 별 정렬을 사용하면 몇 가지 자세한 설명이 나옵니다 (간단히 말해서 주변 범위에 정의 된 변수에 할당 할 수는 없습니다. 이처럼). 또 다른 일. 'rid = NumRid'는 기본 인수가 컴파일 타임에 평가되어서'rid'가 항상 0이되기 때문에 당신이 원하는 것을하지 않을 것입니다. 클래스 변수를 직접 참조하고 중복 매개 변수를 제거하면 ... – l4mpi

+0

글쎄, 새 투자자가 생성 될 때마다 제거하고 기본 값으로 지정하고 다른 값으로 전달할 수있는 옵션을 지정합니다. 동작을 확인하고 모두 1로 초기화하는 것으로 보입니다. 그것을 이해하고, 당신이 의미하는 바입니다. – Zach

+1

네가 맞다. 나의 선행 논평에서 '0'은 '1'이어야만한다. 다른 값을 전달할 수있게하려면 센티널 값을 기본값으로 사용하십시오. 유효한 값이 아니면 일반적으로 '없음'을 선택합니다. 그런 다음 인수가 센티넬이면 메서드 내에서 테스트하고 현재 인수 인 경우에는 현재 NumRid를 취하고 그렇지 않으면 인수 값을 가져옵니다. – l4mpi

답변

3

__init__ 함수 안에는 NumRid이 없지만 아직 증가 시키려고합니다. 이 (: self.__class__.NumRid += 1 클래스의 이름을 변경에 대해 미래 지향적으로, 또는)는 클래스 변수 인 경우, 인스턴스 변수, 또는 Person.NumRid += 1 경우

그것도 self.NumRid += 1을해야합니다.

0

범위가 __init__ 인 경우 범위가 해당 함수가 아니라 클래스입니다. 따라서 NumRid은 해당 범위에 정의되어 있지 않습니다. 증가 시키려면 전체 이름 (Person.NumRid)을 사용해야합니다.