2016-06-29 3 views
3

저는 파이썬에 익숙하지 않아 매달 예산을 학습 기회로 관리 할 모듈을 만들기로 결정했습니다. 모듈의 기본 객체가객체 속성을 호출 할 때 최대 재귀를 초과했습니다.

class Debit(object): 

    currency = "SEK" 

    def __init__(self,date,tag,ammount): 
     self.date = date 
     self.tag = tag 
     self.ammount = ammount  
나는이 객체의 속성이 올바르게 입력되었는지 제어하고, 할 수 있기를 원

으로 정의, 직불 될 것이다 그래서 나는이 같은 속성 재생하려고

@property 
def date(self): 
    return self.date 
@date.setter 
def date(self, d): 
    if len(d) == 0: 
     raise Exception("Date cannot be empty") 
     self.date = d 

NB : 사실, 나는 빈을 입력하려고하면 : 조건과 date.setter에서 예외가 관련성이 무언가로 변경됩니다, 그냥 절반 밖에 방법이 작동 예외 을 원했고 날짜 문자열, 예외가 발생했습니다. 그때 정확한 날짜를 입력하고 그러나, 나는 .date 사용하여 검색을 시도 내가 속성과 세터 내부에서 "날짜"를 지정할 때 나는 강제로 나쁜 일을하고 있다고 가정

RuntimeError: maximum recursion depth exceeded 

다음과 같은 오류가 발생했습니다 파이썬을 무한 루프로 만들었지 만, 나는 그 주위에서 정말로 머리를 쓸 수 없다.

어떤 도움이 필요합니까?

+1

날짜 자체가 재귀 적으로 호출됩니다. 날짜 데이터의 이름을'_date'와 같은 다른 이름으로 지정하십시오 – syntonym

+0

객체 초기화 또는 속성 및 설정자를 의미합니까? –

+2

object.date에 접근 할 때마다'def date (self)'함수가 호출됩니다. 그래서 내부에서 self.date에 접근하면 ...'date (self)'가 호출됩니다. getter와 얻은 데이터를 어떻게 든 구별해야합니다. 'self._data'를 반환 할 때'date (self)'를 호출하지 않도록 실제 데이터'_data'의 이름을 지정하면됩니다. – syntonym

답변

3

모든 개체는 속성, 기능/방법 또는 다른 것들과 상관없이 구성원을 유지하는 네임 스페이스 (실제로는 dict)를가집니다. 귀하의 경우에는

, 당신은 방법원시의 이름 date을 모두 사용하려고합니다. 이로 인해 충돌이 발생하므로 메서드 또는 프리미티브가 date이라는 이름으로 알려져 있습니다.

이제 Debit.date이 일반적인 방법 인 경우 __init__self.date = date을 설정하면 값으로 메서드를 덮어 씁니다. Debit.date은 속성이므로 값을 설정하는 데 사용자 지정 동작을 사용합니다. self.date = date은 속성을 바꾸지 않지만 해당 설정자는 Debit.date.setter입니다.

재귀는 설정자가 self.date (다시 속성이기도 함)에 쓰려고하므로 Debit.date.setter을 사용하려고 시도하기 때문에 발생합니다.

@date.setter # makes the method available as `Debit.date` 
def date(self, d): 
    if len(d) == 0: 
    raise Exception("Date cannot be empty") 
    self.date = d # sets `Debit.date`, i.e. calls `Debit.date.setter(self, d)` 

으로이 질문에 대한 의견에서 지적, 귀하의 경우에 일반적인 방법은 재산date속성_date의 이름을 지정하는 것입니다. 이렇게하면 이름 충돌을 피할 수 있지만 두 요소가 함께 있다는 것을 분명하게 알 수 있습니다.

class Debit(object): 
    currency = "SEK" 

    def __init__(self,date,tag,ammount): 
    self.date = date # use of self.date calls the setter to set self._date with input checking 
    self.tag = tag 
    self.ammount = ammount 

    @property 
    def date(self): # property getter 
    return self._date # provide attribute 

    @date.setter 
    def date(self, d): # property setter 
    if len(d) == 0: 
     raise Exception("Date cannot be empty") 
    self._date = d # set attribute 
관련 문제