yuns
문법(2) 본문
반응형
구름 - AI기술 자연어 처리 전문가 양성 과정 수업
클래스, 메소드, 모듈, 패키지, 심화 자료구조, 문자열, 정규표현식
Object-oriented programming
- Class
- Attribute(data, 속성)
- Method(행동)
- Instance
- Class에 속하는 값들 선언
Class Declaration
- Class 선언부
- class(예약어) Student(클래스 이름)(object(부모 클래스)):
- 클래스 이름은 CamelCase관습적으로 사용됨(앞글자가 대문자)
- 부모 클래스가 저장되지 않을 경우 object가 자동으로 상속됨
- Class 속성
- 클래스 전체가 공유하는 속성 값
- 모든 객체가(instace)가 같은 값을 참조
- 남용하면 스파게티 코드의 원인이 됨
class Student(object): SCHOOL = 'KOREA' print(Student.SCHOOL)
- 클래스 함수 Method
- 각 객체에 적용이 가능한 함수
- 현재 수정하고자 하는 객체를 'self'로 지칭
- 파이썬은 'self'를 첫번째 파라미터로 명시적으로 받음
- Class 속성
- 각각의 객체가 개인적으로 가지는 값
- instance.attr 형태로 접근
- class 형태로 선언되어 나온 객체는 언제든지 attribute 수정 가능
- Magic Method: method 이름이 '__METHOD__' 일 경우 특별한 magic method
- Initializer 생성자(__init__)
- 객체를 생성할 때 호출됨
- 일반적으로 객체의 속성을 초기화 하는데 사용
- Class(args, )형태로 호출하여 객체 생성
- Destroyer 소멸자(__del__)
class Student: def __del__(self): self.classes.clear()
- 객체를 소멸할 때 호출됨
- 파이썬은 Garbage Collection로 메모리 관리
- del 명령어로 명시적으로 없애기 가능, 참조를 명시적으로 삭제할 뿐, 객체를 명시적으로 삭제하지 않음
-
del [instance_name]
- Indexing (__getitem__, __setitem__)
-
class DoubleMapper(object): def __init__(self): self.mapping = {} def __getitem__(self, idx): return self.maping.get(idx, idx * 2) #return self.mapping.get(key, return=None) def __setitem__(self, idx, item): self.mapping[idx] = item mapper = DoubleMapper() print(mapper[10], mapper[1, 2]) mapper[10] = 15 print(mapper[10], mapper[1, 2])
-
- Length (__len__)
- 값을 복사하면 메모리가 많이 사용되기 때문에 아래와 같이 진행
-
class Dataset: def __init__(self, data, times=3): self.data = data self.times = times def __len__(self): return len(self.data) * self.times def __getitem__(self, index): if index > len(self): raise IndexError() return self.data[idx % len(self.data)] dataset = Dataset([10, 2, 5, 2], times=5) print(len(dataset))
- Typing
-
class Student: def __init__(self, name: str, sid: int): self.name = name self.sid = sid def __str__(self): return self.name + "_" + str(self.sid) ex = Student("Hello", 1234) print(ex)
- 객체를 다른 타입으로 형 변환할 때 호출
- __int__, __float__, __bool__
-
- Comparsion Operator
-
class Student: def __init__(self, name: str, sid:int): self.name = name self.sid = sid def __lt__(self, other): return self.sid < other.sid students = [ Student('kim', 1234), Student('Lee', 5678) ] print(*[student.name for student in sorted(students)])
- A < B를 초출 --> A.__lt__(B)를 호출
- 이외에도 __le__(less equal), __gt__(greater than), __ge__(greater equal), __eq__, __ne__ 존재
-
- Arithemetic Operator
-
class MyComplex: def __init__(self, real, imaginary): self.real = real self.imaginary = imaginary def __str__(self): return str(self.real) + "+" + str(self.imaginary) + "j" def __add__(self, other): return MyComplex( self.real + other.real, self.imaginary + other.imaginary ) a = MyComplex(3, -5) b = MyComplex(-6, 7) print(a + b)
- __sub__, __mul__존재
-
- Callable 함수화 메소드(__call__)
-
class AdditionNumber(object): def __init__(self, number: int): self.number = number def __call__(self, number: int): return number + self.number addition_5 = AdditionNumber(5) print(addition_5(10))
- 생성된 객체를 호출 가능하도록 함
- instance(args, ...)가 instance.__call__(args,...)를 호출
-
- Context Manager
-
class Student: def __init__(self, name, sid): self.name = name self.sid = sid def __enter__(self): #with 구문에 들어갈 때 사용 self.classes = set() return self def __exit__(self, exc_type, exc_value, trace): self.classes.clear() kim = Student("Kim", 12345) with kim: kim.classes.add('Hello') with Student('Kim', 12345) as kim: kim.classes.add('Hello')
- 소멸자 대용으로 특정 Block 입장/종료 시 자동으로 호출
- File description 등을 자동으로 닫고자 할 때 사용
-
- Property
- Property (@property) 를 통하여 Getter, Setter를 명시적으로 설정 가능
- Encapsulation등에 활용
- Initializer 생성자(__init__)
- Static & Class Method
- 두 가지 정적 함수 존재
- 객체에는 접근 불가능
- 일반적으로 Class.method 형태로 사용
- Static Method
- staticmethod(@staticmethod) 꾸밈자 사용
- 특별한 argument 받지 않음
- 일반적으로 class 내 유틸 함수로 사용
- Class를 일종의 Namespace로 사용
- Class Method
- classmethod(@classmethod) 꾸밈자 사용
- 호출된 class인 cls 받음(self와 비슷)
- factory 패턴에서 사용
- 상속시 차이가 발생
- 두 가지 정적 함수 존재
상속 & 다형성
- 상속: 기존에 구현되어 있는 틀을 상속받아 새로운 틀을 만드는 것
- 기존의 틀: 부모 클래스, 새로운 틀: 자식 클래스
- 자식 클래스에서는 부모의 기능을 사용할 수 있음
- 다형성: 같은 이름의 메소드를 다르게 작성하느 ㄴ것
- 각 자식 클래스가 다른 클래스와 차별화 됨
- Python 에서의 상속과 다형성
- 다중 상속 지원
- 죽음의 다이아몬드
- 메서드 탐색 순서를 따름(mro)
- super 내장함수를 이용하여 상위 클래스 접근 가능
class A:
CONSTANT = 10
class B(A):
pass
class C(A):
CONSTANT = 10
class D(B, C):
pass
print(D.mro()) >> D -> B -> C -> A
print(D.CONSTANT) >> 10
super의 형태는 super(class, instance)형태로 되어 있어야 됨 --> 상위 클래스로 변환
Visibility
- 명시적 private & protected의 범위가 없음 --> 모두 public
- private 변수 함수 앞에 __ 를 붙임
- protected 변수 함수 앞에 _를 붙임
- dir(instance)할 경우에는 private, protected 내용이 생략되어 있음
Module and Packages
Importing from Other Files
- 모듈화를 하기 위함
- [].py 함수
- Import 구문을 사용하여 모듈을 불러옴
- 파이썬이 실행되는 곳에서의 경로
- __name__: 현재 모듈의 이름을 보여줌
반응형
'goorm 수업 정리 > 파이썬' 카테고리의 다른 글
파일 입출력 (0) | 2021.08.06 |
---|---|
정규표현식 (0) | 2021.08.06 |
자료구조, 문자열, 정규표현식 (0) | 2021.08.05 |
문법 (0) | 2021.08.03 |
Intro (0) | 2021.08.02 |
Comments