생성자(constructor)
생성자(constructor)는 클래스의 실행을 위한 인수들을 전달하기 위한 장치입니다.
다음 클래스는 기사 "클래스의 정의"에서 소개한 코드입니다.
class simpleStatistic: """데이터의 합계, 평균, 중간값, 최빈값, 그리고 표준편차를 계산합니다.""" subject="math" def __init__(self, obj): self.obj=obj def sum(self): total=0 for i in self.obj: total +=i self.total=total return(self.total) def mean(self): tot=self.sum() self.mu=tot/len(self.obj) return(self.mu) def median(self): value=sorted(self.obj) n=int(len(value)/2) if n % 2 ==0: med=(value[n-1]+value[n])/2 else: med=value[n] self.med=med return(self.med) def mode(self): re={} for i in self.obj: re[i]=self.obj.count(i) v=list(re.values()) k=list(re.keys()) self.mod=k[v.index(max(v))] return(self.mod) def std(self, df=0): n=len(self.obj)-df mu=self.mean() sd=0 for i in self.obj: sd += (i-mu)**2 self.sd=(sd/n)**(1/2) return(self.sd)
위 클래스 simpleStatistic은 호출과 함께 데이터 x를 전달받습니다. 이 과정은 클래스 생성시 부여되는 내장 메소드인 __init__()
를 활성화시키는 것으로 이루어 집니다. 이 메소드는 클래스 호출과 함께 실행되는 것으로 클래스의 첫번째 메소드인 def __init__()
에 의해 구현되므로 이를 통해 클래스 실행에 필요한 인수(들)를 전달할 수 있습니다. 즉, 클래스를 초기화합니다. 생성자를 통해 전달받은 인수를 클래스의 모든 특성과 연결되는 인수(객체)인 self에 저장하므로 클래스 전체에서 사용할 수 있습니다.
다음은 피보나치 수열을 생성하기 위한 클래스의 일부로 수열의 범위를 지정하기 위한 인수를 생성자에 전달한 것입니다.
class Fib: ''' iterator that yields numbers in the Fibonacci sequence''' # ① def __init__(self, mx): # ② self.mx=mx if self.mx < 0: raise ValueError("maximum should be positive.") #③
- ① 클래스에 대한 간략한 설명 즉, docstring 입니다.
- ② __init__() 메소드는 클래스 개체인 인스턴스를 생성하면서 호출됩니다. 즉, 인스턴스 생성시 첫번째로 실행되는 코드입니다. 이 메소드의 인수 중 첫번째 인수는 self입니다. 이것은 클래스의 모든 부분들을 참조하는 객체(인수)입니다.
- ③ 함수 raise()은 특정 조건에 에러를 발생시킵니다.
b=Fib(-10)
ValueError: maximum should be positive.
생성자는 결과를 반환하는 함수인 return()을 가질 수 없습니다. 즉, __init__()는 None 만을 반환합니다. 다음 코드와 같이 클래스 Fib의 생성자에 return()
을 포함시키는 경우 에러가 발생됩니다.
class Fib: ''' iterator that yields numbers in the Fibonacci sequence''' def __init__(self, mx): self.mx=mx if self.mx < 0: raise ValueError("maximum should be positive.") return self.mx
Fib(10)
TypeError: __init__() should return None, not 'int'
파이썬의 모든 객체는 클래스로 이루어집니다. 즉, 각 객체의 유형이나 구조에 따라 객체 생성과 동시에 다양한 내장 속성(built-in attribution)과 내장 메서드(built-in method)들과 연결됩니다. 다시 말하면 이들은 이름공간에 저장된 클래스 이름과 참조관계가 성립됩니다. 참조 대상물은 내장함수인 dir()
함수로 확인할 수 있습니다.
print(dir(simpleStatistics)) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', ..., 'mean', 'median', 'mode', 'std', 'subject']
예를 들어 __dict__와 __doc__는 클래스가 사용할 수 있는 속성과 메소드들, 그리고 이 클래스에 대한 문서(주석)를 반환합니다.
simpleStatistic.__dict__
mappingproxy({'__module__': '__main__', '__doc__': '데이터의 합계, 평균, 중간값, 최빈값, \n 그리고 표준편차를 계산합니다.', 'subject': 'math', '__init__':, 'sum': , 'mean': , 'median': , 'mode': , 'std': , '__dict__': , '__weakref__': })
simpleStatistic.__doc__
'데이터의 합계, 평균, 중간값, 최빈값, \n 그리고 표준편차를 계산합니다.'
댓글
댓글 쓰기