-
[Python] 클래스2Study/Python 2021. 6. 4. 17:25
int 클래스
__init__() 생성자를 이용한 객체 생성
- 아래의 두 가지 방법으로 객체 생성 가능
a= 10 type(a) => <class 'int'>
a = int(10) type(a) => <class 'int'>
- 첫 번째 방법처럼 그냥 a=10이라 해도 __init__() 생성자를 호출
- 파이썬에서는 정수 객체를 만드는 일이 많아서 간단하게 첫 번째 방법처럼 작성해도 정수 객체를 생성하도록 설계되어있음.
- 정수 뿐만 아니라 다른 아홉 가지 자료형도 마찬가지
b = 3.5 type(b) => <class 'float'>
b = float(3.5) type(b) => <class 'float'>
연산자 중복
- 메소드에 +나 -같은 연산자 개념이 중복되어 있음.
메소드 == 연산 기호
__add__(self, other) == +
__sub__(self, other) == -
__mul__(self, other) == *
__truediv__(self, other) == /
...
a = 30; b = 7 c = a + b
이 코드와
a = int(30); b = int(7) c = a.__add__(b)
나
a = int(30); b = int(7) c = int.__add__(a, b)
는 같은 내용의 코드
r로 시작하는 메소드
- 앞에 r이 붙은 메소드는 피연산자를 바꾸어 계산
a.__radd__(b) == b + a
컨테이너 자료형(list, tuple, dict, set) 클래스
컨테이너 자료형과 __메소드들
- 집합과 사전에 +, * 연산자를 사용할 수 없는 이유는 __add__(), __mul__() 메소드가 없기 때문
__add__의 +연산자 중복, __mul__의 *연산자 중복
- __add__() 메소드가 있는 자료형은 +연산이 가능
- __mul__() 메소드가 있는 자료형은 *연산이 가능
- 집합과 사전 자료형은 __add__(), __mul__() 메소드가 없기 때문에 +, * 연산이 불가능
__contains__(), __len__() 메소드
- 컨테이너 자료형은 모두 __contains__() 메소드를 갖고 있음. __contains__() 메소드는 in, not in 연산자를 지원
- 컨테이너 자료형은 각 자료형에 __len__() 메소드가 정의되어 있기 때문에 모두 len() 내장함수를 이용하여 원소의 개수를 구할 수 있음. 's' in A == A.__contains__('s') len(A) == A.__len__()
range() 반환값과 reversed() 반환값의 비교
- range() 함수의 반환값 객체는 __len__() 메소드를 갖고 있음.
- reversed() 함수의 반환값 객체는 __len__() 메소드가 없음.
len(range(5)) => 5
len(reversed([1, 2, 3, 4])) => 오류!!
__getitem__() 메소드
- 시퀀스 자료형과 사전 자료형에서 [] 기호를 이용하여 원소에 접근할 수 있는 것이 __getitem__() 메소드가 지원되기 때문임. A[2] == A.__getitem__(2)
__setitem__(), __delitem__() 메소드
- 리스트와 사전에만 있는 메소드(인덱스 개념이 있는 mutable 자료형)
- 리스트에서 아이템을 수정하거나 삭제하는 메소드
A[2] = 5 == A.__setitem__(2, 5)
del A[2] == A.__delitem__(2)
__iter__() 메소드
- 어떤 객체가 iterable인지 판단하는 메소드
- int 자료형에는 __iter__() 메소드가 없기 때문에(정수는 iterable 객체가 아니기 때문에) for 반복문 사용이 불가능
__str__, __repr__ 메소드
- print(리스트 객체), print(집합 객체)는 객체의 데이터 자체가 출력
- print(프로그래머가 만든 객체)는 객체의 참조값인 id가 출력
- __str__(), __repr__() 메소드를 이용하면 프로그래머가 만든 객체도 print() 함수를 이용하여 참조값이 아닌 데이터 자체가 출력
class Dog:
def __init__(self, name):
self.name = name
happy = Dog('Happy')
print(happy)
=> <__main__.Dog object at ~~>
- __repr__(), __str__() 메소드는 둘 다 작성해도, 하나만 작성해도 됨. print() 함수를 만나면 __str__() 메소드가 있는지 확인하고, 있으면 __str__() 메소드 실행. 없으면 __repr__()메소드가 있는지 확인하고 있으면 __repr__() 메소드를 실행.
class Dog:
def __init__(self, name):
self.name = name
def __repr__(self):
return self.name
happy = Dog('Happy')
print(happy)
=> Happy
'Study > Python' 카테고리의 다른 글
[Python] 데이터 분석 특강 정리2 (0) 2021.06.30 [Python] 데이터 분석 특강 실습 정리 (0) 2021.06.29 [Python] 클래스 (0) 2021.06.01 [Python] 모듈 (0) 2021.05.25 [Python] 함수 (0) 2021.05.18