import math
math.ceil(3.49)4
위 맥락에서 math.ceil()함수는 무엇인가를 살펴보는데, math 모듈은 파이썬이 아니라 C로 작성되어 있어(성능을 위해 C 표준 수학 라이브러리를 사용) 소스 코드를 직접 열어볼 수 없기 때문에, 대신 파이썬으로 작성된 statistics 모듈을 살펴보면,
import statistics # statistics 모듈을 import
# ?: 객체에 대한 설명을 간단히 볼 수 있는 jupyter notebook 특수 명령어
?statisticsstatistics.py 파일을 열어보면, 실제 코드가 있음모듈이름.함수이름() 방식참고로 search bar에서 @: 현재 문서에서 특정 키워드를 종류별로 검색할 수 있음
import statistics
# statistics 모듈에 정의된 함수들 중 하나인 mean 함수를 호출
statistics.mean([1, 2, 3, 4, 5])
# 모듈 이름을 별칭으로 줄여서 쓰고 싶다면 as로
import statistics as stats
stats.mean([1, 2, 3, 4, 5])
# 특정 함수만 가져오고 싶다면, from 모듈이름 import 함수이름
from statistics import mean
mean([1, 2, 3, 4, 5])클래스(class)를 하나 살펴보기 위해 다시 statistics.py 파일을 열어,
search bar에서 @: 로 NormalDist 클래스를 검색해서 살펴보면,
클래스 내부에 여러 함수들이 정의되어 있고(이를 메서드라고 함), 이 함수들을 .을 이용해 호출할 수 있음
class NormalDist:
"Normal distribution of a random variable"
# ...
def samples(self, n, *, seed=None):
"Generate *n* samples for a given mean and standard deviation."
rnd = random.random if seed is None else random.Random(seed).random
inv_cdf = _normal_dist_inv_cdf
mu = self._mu
sigma = self._sigma
return [inv_cdf(rnd(), mu, sigma) for _ in repeat(None, n)]
# ...위에서 normal_dist는 NormalDist 클래스의 인스턴스(instance)라고 하고, 객체라고 부름
클래스는 설계도(빵틀)이고 이로부터 여러 객체(빵)를 만들 수 있음
특정 객체들은 설계도(클래스)에서 정의된 함수들을 그대로 품고 있고, .을 이용해 호출할 수 있음
가령, 위에서 samples라는 함수(메서드)를 다음과 같이 호출할 수 있음
이제 파이썬의 내장 데이터 타입(모두 클래스로 정의됨)에 적용해보면
이 리스트라는 클래스에 정의된 함수(메서드)들 중 하나인 reverse 메서드를 호출해보면,
x.까지 치면 리스트 객체에 정의된 메서드들이 나옴
이는 다음과 같이 리스트 클래스로부터 직접 호출할 수도 있음
내장 함수인 len()도 이 원리와 이어짐
즉, len(x)는 내부적으로 x.__len__()을 호출함
그래서 다음과 같이 메서드를 직접 호출해도 같은 결과가 나옴
정확히 말하면,
len()은 어느 클래스에도 속하지 않는 독립적인 내장 함수임__len__()을 호출하고, 돌려받은 값이 0 이상의 정수인지까지 확인함abs()와 같은 함수는 던더 메서드에 그대로 위임함__abs__()이 돌려준 값을 검사하지 않고 그대로 내보냄이 원리를 다음과 같이 문자열 객체에 적용하면,
은 사실 내부적으로 문자열 클래스에 정의된 __len__ 메서드를 호출한 것임
같은 len()을 써도 리스트면 리스트 클래스의 __len__, 문자열이면 문자열 클래스의 __len__이 호출됨; 이를 다형성(polymorphism)이라고 함
이는 객체지향 프로그래밍의 전형적인 특징으로 이해할 수 있음.
즉, 클래스라는 설계도를 만든 후, 이 설계도 안에서 정의된 함수들을 객체들이 호출할 수 있음
다음의 다른 예들을 살펴보면,
같은 + 연산자라도 어떤 클래스의 객체인지에 따라 각 클래스에 정의된 __add__가 호출되어 다른 의미를 가짐
위의 + 연산자는 문자열 클래스에서 정의된 메서드를 호출한 것임