2010-08-23 3 views
2

시간을 유지하는 방법에 몇 가지 단점이있는 응용 프로그램의 데이터를 처리하고 있습니다. 더 단순한 단점 중 하나는 월 + 일 대신 "일년"(1 월 1 일, 2 월 1 일은 32 등)을 사용한다는 것입니다. 그래서 기본 datetime 클래스에서 상속 받고 몇 가지 사용자 정의 메서드가있는 자체 날짜 클래스를 만들고 싶습니다. 나는이 낮 시간에 전화하고있다. 이상한 포맷으로 출력하는 메소드 외에, 나는 이상한 포맷을 주간에 입력하는 메소드가 필요하다. .fromordinal() 메서드가 datetime에서 호출 될 수있는 것처럼, 나는 낮에서 호출 할 수있는 .fromdayofyear() 메서드가 필요합니다. 지금까지 내가 가지고 :Python의 사용자 정의 클래스 : 인스턴스에서 메소드를 호출해야합니까?

import datetime 

class daytime(datetime.datetime): 
    @property 
    def dayofyear(self): 
     return (self.date - datetime.date(self.year,1,1)).days + 1 
    def fromdayofyear(year,dayofyear): 
     return datetime(year,1,1)+datetime.timedelta(dayofyear-1) 

을 문제는 fromdayofyear 클래스이기 때문에, 그것은 어떤 방법을 수행하기 위해 낮의 인스턴스를 필요로한다는 것이다.

>>> from utils import daytime 
>>> day = daytime.fromdayofyear(2010,32)   #should give a datetime, Feburary first 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unbound method from_datetime() must be called with DayTime instance as first argument (got str instance instead) 
>>> 

이 작업을 수행하는 일련의 기능을 쉽게 작성할 수는 있지만 맞춤 클래스를 만드는 시점부터 시작해야합니다. 아마 여기 수업을 사용하지 말아야한다는 것을 알았습니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?

편집 :

는 여기가에 정착 내용은 다음과 같습니다

import datetime 

class daytime(datetime.datetime): 
    @property 
    def dayofyear(self): 
     return (self.date - datetime.date(self.year,1,1)).days + 1 
    @classmethod 
    def fromdayofyear(cls,year,dayofyear): 
     dt = cls(year,1,1)+datetime.timedelta(dayofyear-1) 
     return cls(dt.year,dt.month,dt.day) 
+0

어떤 끔찍한 '특질'- 당신이 윤년을 고려 있는지 확인하십시오! –

+0

더 끔찍할 수 있습니다 - 16 비트 날짜 형식을 회상합니다. 높은 7 비트는 1900 년 이후의 해 였고, 낮은 9 비트는 일년이었습니다. HP3000 MPE 운영 체제 IIRC의 어딘가. –

답변

2

영업의 솔루션은 라는뿐만 아니라 을 언급 할 심각한 버그 (self.date 필요를 가지고 "에 정착을";과 fromdayofyear 방법은 실제로하는 datetime.datetime 인스턴스를 반환하지 a daytime 하나를 사용하여 명백한 시도에도 불구하고 cls).

여기에 의도 한대로 내가 일을 생각 버전입니다 :

class daytime(datetime.datetime): 

    @property 
    def dayofyear(self): 
     return (self.date() - datetime.date(self.year, 1, 1)).days + 1 

    @classmethod 
    def fromdayofyear(cls, year, dayofyear): 
     dt = datetime.datetime(year, 1, 1) + datetime.timedelta(dayofyear-1) 
     return cls(dt.year, dt.month, dt.day) 
+0

THC4K의 답변에 대한 귀하의 의견이 정확합니다. 내 솔루션을 업데이트하겠습니다. – chriscauley

8

당신은 @classmethod 장식을합니다. 그런 다음 메서드는 첫 번째 인수로 객체 인스턴스 대신 클래스를 가져옵니다. 그것은 CLS 호출 관례 :

@classmethod 
def from_file(cls, f): 
    return cls(f.read()) 
+0

당신이 흔들립니다. 이 질문에 대한 답변을 드릴 것입니다. – chriscauley

관련 문제