파이썬 오브젝트 소스코드 간단히 보기 및 스탠다드 라이브러리 메소드 오버라이딩
05 Jun 2017 | Python Python Calendar파이썬 오브젝트 소스 코드 보기
-
inspect
모듈 임포트import inspect
-
살펴볼 오브젝트 임포트
from calendar import HTMLCalendar
-
소스코드를 보기좋은 형태로 출력
print(inspect.getsource(HTMLCalendar))
스탠다드 라이브러리 메소드 오버라이딩
HTMLCalendar는 베이스 클래스인 Calendar를 상속받아 HTML 달력을 만들어주는 역할을 하는 클래스이다.
0(월요일:디폴트)에서 6(일요일)까지 달력의 시작을 정의하는 하나의 firstweekday인자를 전달받는다.
print(calendar.HTMLCalendar(6).formatmonth(2017,6))
과 같이 입력하면 아래의 달력이 출력된다.
June 2017 | ||||||
---|---|---|---|---|---|---|
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |
오브젝트 소스코드를 살펴보고 HTML Calendar의 첫번째 row에 좌/우 이동 화살표(<,>)를 출력해보자.
파이썬 라이브러리 코드
def formatmonthname(self, theyear, themonth, withyear=True):
"""
Return a month name as a table row.
"""
if withyear:
s = '%s %s' % (month_name[themonth], theyear)
else:
s = '%s' % month_name[themonth]
return '<tr><th colspan="7" class="month">%s</th></tr>' % s
주석을 보면 달 이름을 테이블 행 형태로 돌려주는 메소드이고, 리턴값은 HTML의 형태인 것을 알 수 있다.
해당 메소드를 바로 오버라이딩 하면 month_name[themonth]
구문에서 오류가 뜨는데,
month_name은 calendar 모듈의 Data 속성이므로 from calendar import month_name
를 해야한다.
오버라이딩한 메소드
from calendar import HTMLCalendar, month_name
class ArrowCalendar(HTMLCalendar):
def __init__(self, firstweekday):
HTMLCalendar.__init__(self, firstweekday)
def formatmonthname(self, year, month, withyear=True):
if withyear:
s = '%s %s' % (month_name[month], year)
else:
s = '%s' % month_name[month]
return '<tr><th colspan="1" class="month_arrow"> < </th>' \
'<th colspan="5" class="month">%s</th>' \
'<th colspan="1" class="month_arrow"> > </th></tr>' % s
7칸짜리 테이블로 달 이름을 넘겨주는 것을 5칸으로 줄이고 양쪽에 한칸씩 좌/우 화살표를 넣었다.
이후 css 클래스를 적용해서 화살표를 정렬하면 완성
.month_arrow {
text-align: center;
}
완성된 달력
< | June 2017 | > | ||||
---|---|---|---|---|---|---|
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |
Comments