yuns

문법(2) 본문

goorm 수업 정리/파이썬

문법(2)

yuuuun 2021. 8. 4. 10:24
반응형

구름 - 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등에 활용
  • 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