2017-11-28 10 views
2

저는 파이썬에 완전히 익숙하지 않습니다. 두 가지 속성 만 저장하는 클래스를 작성하려고합니다. 하나는 숫자이고 다른 하나는 datetime 객체입니다. 비록 내가 좋아할지라도, date을 datetime으로 저장하는 동안 "dd.mm.yyyy"와 같은 문자열을 사용하여 초기화하고 출력 할 수 있습니다. self.date에서파이썬의 게터와 세터

class MyClass: 
    number = None 
    date = None 

    def __init__(self, params): 
     self.number = params["number"] 
     self.date = params["date"] 

    @property 
    def date(self): 
     return datetime.datetime.strftime(self.date, '%d.%m.%Y') 

    @date.setter 
    def date(self, value): 
     self.date = datetime.datetime.strptime(value, '%d.%m.%Y') 

    def get_vars(self): 
     return vars(self) 

그러나 런타임에 @property 점을 다음과 같이 말한다 : 그래서 내가 갈 Expected type 'datetime', got 'str' instead는. 설정 중에 날짜로 변환 할 때 문자열을 가져 오는 방법은 무엇입니까? 왜 이런 일이 일어나는 걸까요? 혼란스러워. 예를 들어

:

>>> MyClass({'number': 42, 'date': '28.12.2017'}) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 8, in __init__ 
    File "<string>", line 16, in date 
    File "<string>", line 16, in date 
TypeError: strptime() argument 1 must be str, not datetime.datetime 
+0

* Full traceback *과 'MyClass' 인스턴스를 생성하는 코드를 포함하십시오. 이 특정한, 제한된 경우 * 정확히 무슨 일이 있었음에 틀림 없습니까? * 역 추적은 미래의 방문자가 동일한 문제가 있는지 쉽게 알 수 있도록합니다. –

답변

3

당신은 property 개체 및 인스턴스 속성을 모두 date을 사용할 수 없습니다. 이 속성은 data descriptor이므로 사용할 수 있으며 self.date은 해당 속성 개체를 참조합니다. self.date = params['date'] 표현은 param['date'] 값을 설정자에게 전달 중이며 인스턴스 속성을 설정하지 않습니다.

param['date']이 확실하게 datetime 개체 인 경우, 이는 해당 설정자 datetime.datetime.strptime(<datetime instance>, '%d.%m.%Y')이 호출되면 실패한 것입니다. 성공 했더라도 그 결과를 다시 self.date에 할당하려고 시도합니다. 이는 다시 무한한 세터를 호출합니다. datetime 값을 처음으로 전달했기 때문에 또는 문자열을 전달한 후 첫 번째 .strptime() 호출이 성공했으며 self.date에 방금 생성 된 datetime 인스턴스가 할당되었습니다.이 인스턴스는 datetime 인스턴스입니다.

인스턴스 이름의 이름을 바꿉니다.

class MyClass: 
    _number = None 
    _date = None 

    def __init__(self, params): 
     self._number = params["number"] 
     self._date = params["date"] 

    @property 
    def date(self): 
     return self._date.strftime('%d.%m.%Y') 

    @date.setter 
    def date(self, value): 
     self._date = datetime.datetime.strptime(value, '%d.%m.%Y') 

    def get_vars(self): 
     return vars(self) 

가 나는 또한 datetime.datetime.strftime(self._date, '%d.%m.%Y') 변경 (언 바운드 메서드 호출) self._date에 메서드 호출 : 그것을 선도 하나의 밑줄을주는 것은 일반적으로 여기에 가장 도움이 명명 체계입니다.

+0

이제 더 효과적입니다. 왜 그런지 이해합니다.) 감사합니다. – Dankevich

+0

질문 하나만 더 드릴까요? vars()와 같은 것은 속성이있는 dict을 반환 할 때 @property를 사용하지 않습니다. 올바른 형식으로'data' 값을 얻기 위해 getter를 사용하는 방법이 있습니까? – Dankevich

+0

@Dankevich : 아니요,'vars()'는 인스턴스 속성 사전을 반환합니다. 클래스의 모든 속성 ('dir (ype (self))')을 찾아야하고 속성이 속성인지 테스트 한 다음 인스턴스의 속성에 액세스하여 그 속성을 나열해야합니다. –