17 장클래스와메소드 박창이 서울시립대학교통계학과 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 1 / 18
학습내용 객체지향특징들객체출력 init 메소드 str 메소드연산자재정의타입기반의버전다형성 (polymorphism) 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 2 / 18
객체지향특징들 객체지향프로그래밍의특징 프로그램은객체와함수정의로구성되며대부분의계산은객체에대한연산으로표현됨객체의정의는 Time 처럼어떤객체나현실의개념에대응됨. 객체에대한함수는 Time 에대한함수들처럼현실에서일어나는일에대응됨 메소드는특정클래스와관련된함수로볼수있으며함수와다음과같은차이가있음 메소드는클래스와의관계를명확히하기위해클래스정의안에서정의됨메소드호출방법은함수호출문법과는다름 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 3 / 18
객체출력 I Time 클래스에대한출력메소드 >>> class Time(object): def print_time(self): print( %.2d:%.2d:%.2d % (self.hour, self.minute, self.second)) >>> start = Time() >>> start.hour = 9 >>> start.minute = 45 >>> start.second = 00 >>> Time.print_time(start) 09:45:00 >>> start.print_time() 09:45:00 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 4 / 18
객체출력 II 메소드의첫파라미터는흔히 self 라불림 print time(start) 는 print time 에게출력할객체를주며 start.print time() 은 start 에게자기자신을프린트하도록함. 즉책임을함수에서객체로옮김 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 5 / 18
init 메소드 I 값초기화 >>> class Time(object): def print_time(self): print( %.2d:%.2d:%.2d % (self.hour, self.minute, self.second)) def init (self, hour=0, minute=0, second=0): self.hour = hour self.minute = minute self.second = second >>> time = Time() >>> time.print_time() 00:00:00 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 6 / 18
init 메소드 II >>> time = Time(9) >>> time.print_time() 09:00:00 >>> time = Time(9, 45) >>> time.print_time() 09:45:00 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 7 / 18
str 메소드 I 문자열로변환 >>> class Time(object): def init (self, hour=0, minute=0, second=0): self.hour = hour self.minute = minute self.second = second def str (self): return %.2d:%.2d:%.2d % (self.hour, self.minute, self.second) >>> time = Time(9, 45) >>> print(time) 09:45:00 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 8 / 18
연산자재정의 I add 메소드를이용하여 Time 객체들간의 + 연산정의 def int_to_time(seconds): minutes, second = divmod(seconds, 60) hour, minute = divmod(minutes, 60) time = Time(hour, minute, second) return time >>> class Time(object): def init (self, hour=0, minute=0, second=0): self.hour = hour self.minute = minute self.second = second def str (self): 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 9 / 18
연산자재정의 II return %.2d:%.2d:%.2d % (self.hour, self.minute, self.second) def time_to_int(self): minutes = self.hour * 60 + self.minute seconds = minutes * 60 + self.second return seconds def add (self, other): seconds = self.time_to_int() + other.time_to_int() return int_to_time(seconds) >>> start = Time(9, 45) >>> duration = Time(1, 35) >>> print(start+duration) 11:20:00 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 10 / 18
타입기반버전 I other 가 Time 객체인경우 add time, 정수인경우 increment 를호출 >>> class Time(object): def init (self, hour=0, minute=0, second=0): self.hour = hour self.minute = minute self.second = second def str (self): return %.2d:%.2d:%.2d % (self.hour, self.minute, self.second) def time_to_int(self): minutes = self.hour * 60 + self.minute seconds = minutes * 60 + self.second return seconds 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 11 / 18
타입기반버전 II def add (self, other): if isinstance(other, Time): return self.add_time(other) else: return self.increment(other) def add_time(self, other): seconds = self.time_to_int() + other.time_to_int() return int_to_time(seconds) def increment(self, seconds): seconds += self.time_to_int() return int_to_time(seconds) 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 12 / 18
타입기반버전 III >>> start = Time(9, 45) >>> duration = Time(1, 35) >>> print(start+duration) 11:20:00 >>> print(start+1337) 10:07:17 1337+start 의경우오류가발생 >>> print(1337+start) Traceback (most recent call last): File "<pyshell#92>", line 1, in <module> print(1337+start) TypeError: unsupported operand type(s) for +: int and Time 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 13 / 18
타입기반버전 IV 이경우 radd 를 Time 클래스내에정의하면됨 def radd (self, other): return self. add (other) 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 14 / 18
다형성 I 여러가지타입의인자에대하여작동하는함수를다형함수라하며코드재사용을쉽게함 원소가해쉬가능하면리스트, 튜플, 사전등에대해서모두작동 >>> def histogram(s): d = dict() for c in s: if c not in d: d[c] = 1 else: d[c] = d[c] + 1 return d >>> t = [ spam, egg, spam, spam, bacon, spam ] >>> histogram(t) { spam : 4, egg : 1, bacon : 1} 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 15 / 18
다형성 II Time 객체에대한 sum 의경우 TypeError: unsupported operand type(s) for +: int and Time 과같은오류가발생 def radd (self, other): if other == 0: return self else: return self. add (other) 로정의하면됨. >>> t1 = Time(7, 43) >>> t2 = Time(7, 41) >>> t3 = Time(7, 37) >>> total = sum([t1, t2, t3]) >>> print(total) 23:01:00 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 16 / 18
디버깅 I hasattr 이외에 dict 속성을이용하여객체의속성에접근 >>> class Point(object): def init (self, x=0, y=0): self.x = x self.y = y >>> p = Point(3, 4) >>> print(p. dict ) { x : 3, y : 4} 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 17 / 18
디버깅 II print attributes 함수를사용하면편리 >>> def print_attributes(obj): for attr in obj. dict : print(attr, getattr(obj, attr)) >>> print_attributes(p) x 3 y 4 내장함수 getattr 은객체와속성이름을받아객체의값을반환 박창이 ( 서울시립대학교통계학과 ) 17 장클래스와메소드 18 / 18