Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python Study 3- Module, Package

Python Study 3- Module, Package

AhnSeongHyun

May 18, 2015
Tweet

More Decks by AhnSeongHyun

Other Decks in Programming

Transcript

  1. 오늘 다룰 것들. 2 클래스 인스턴스 상속 모듈 패키지 배포하기

    정적메소드 클래스 메소드 연산자 오버로딩 추상 기반 클래스 속성 바인딩 클래스/인스턴스 관계 확인
  2. 클래스 3 class 생성하려는 클래스 이름(기반 클래스명): <statement-1> . .

    . <statement-N> - 최상위 object 클래스에서 상속 - statement 에 변수와 함수를 정의 예) Person 이라는 클래스의 정의
  3. 클래스 4 접근 지정자는 없다. 모두 공개(public). 그러나 꼼수가 있다.(이름변형)

    클래스 내 멤버변수/함수의 접근은 무조건 self NameError: global name 'name' is not defined ‘name’ 이라는 변수를 찾을수 없다고.  멤버 변수라 할지라도 내부에서 사용할 때는 반드시 self 를 사용해야 한다.
  4. 클래스 5 멤버함수의 첫번째 인자는 무조건 self. TypeError: get_age() takes

    no arguments (1 given) 인자 하나가 없다고 에러 모든 멤버변수는 무조건 첫번째 인자는 self 이다.
  5. 클래스 변수 와 인스턴스 변수 6 클래스 변수 : 멤버

    함수 밖에서 정의, 인스턴스 & 클래스 모두 접근 가능 인스턴스 변수 : 멤버 함수 안에서 정의, 인스턴스만 접근 가능 접근불가, 에러 name : 클래스 변수 & 인스턴스 변수 self.age : 인스턴스 변수 age : 지역변수(인자) 클래스로 접근할수 있다. ash84 ash84 y3
  6. 상속 12 일반적인 클래스는 object 를 상속받는다. (C#의 Object 클래스

    같은 역할) class 클래스 명(부모-기반 클래스명), Student 클래스가 Person 에서 상속받는다면?
  7. 함수 재정의(오버라이드) 15 함수의 이름만 같으면 재정의 OK, 인자가 달라도

    가능함. 다른 언어(c#, java) 에서는 인자, 리턴값, 이름이 같아야 재정의가 이루어 진다.
  8. 연산자 오버로딩 17 인스턴스끼리 연산할수 있도록, 기존의 연산자를 재정의하는 방식

    메서드(Method) 연산자(Operator) 사용 예 __add__(self, other) + (이항) A + B, A += B __pos__(self) + (단항) +A __sub__(self, other) - (이항) A - B, A -= B __neg__(self) - (단항) -A __mul__(self, other) * A * B, A *= B __truediv__(self, other) / A / B, A /= B __floordiv__(self, other) // A // B, A //= B __mod__(self, other) % A % B, A %= B __pow__(self, other) pow(), ** pow(A, B), A ** B __lshift__(self, other) << A << B, A <<= B __rshift__(self, other) >> A >> B, A >>= B __and__(self, other) & A & B, A &= B __xor__(self, other) ^ A ^ B, A ^= B __or__(self, other) | A | B, A |= B __invert__(self) ~ ~A __abs__(self) abs() abs(A)
  9. 연산자 오버로딩 18 __add__ = __radd__ __sub__ = __rsub__ __mul__

    = __rmul__  연산자가 반대인 경우, 반대의 함수를 정의해 줘야 함. 클래스 안에 연산자 오버로딩 함수들을 구현해야만, 해당 연산자를 이용해서 인스턴스 끼리 연산 가능
  10. 정적 메소드 19 클래스안에 들어있는 보통함수, self 가 없다. 인스턴스로

    호출 할 수가 없다. 클래스로 호출 @staticmethod 로 지정 필요  에러 발생
  11. 클래스 메소드 21 클래스 자체를 객제로 보고 클래스 객체에 대해서

    작동 하는 메서드 @classmethod 암묵적으로 cls 를 첫번째 인수로 전달됨.
  12. 클래스 간의 관계 확인 24 (<type 'object'>,) (<class '__main__.Person'>,) False

    True Person 이 Student 의 자식클래스? Student 가 Person 의 자식클래스? __bases__ 는 상위 클래스를 보여준다.  클래스 자체에 대한 확인작업, 인스턴스가 아님.
  13. 인스턴스 간의 관계 확인 25 True True True False 

    isinstance 는 해당 인스턴스가 해당 클래스인지 확인, 자식(서브)클래스도 포함 p1이 Person의 인스턴스 인가? st1이 Student 의 인스턴스 인가? st1이 Person의 인스턴스 인가? p1이 Student 의 인스턴스 인가?
  14. 데이터 캡슐화(이름변형) 27 접근 지정자는 없다. 모두 공개(public). 그러나 꼼수가

    있다.(이름변형) 자, 이제 꼼수를 알아보자. 멤버변수에서 __변수명 으로 선언, 인스턴스에서 변수 바로 접근 x __변수명 => _클래스명__변수명 예) __name => _Person__name 굳이...
  15. 메모리 관리 28 __new__() : 인스턴스 생성 __init__() : 초기화

    레퍼런스 카운트에 의해서 관리 0 이 되면, 가비지컬렉션에 의해서 파괴, __del__() 호출 __del__() 을 믿지말자 인스턴스를 생성하면은..
  16. 속성 바인딩 29 인스턴스는 __dict__ 에 의해서 구성/관리 된다. {'tel':

    8819, 'name': 'ash84'} {'tel': 8819, 'name': 'ash84', 'addr': 'seoul, korea'} {'tel': 8819, 'name': 'ash84'}  인스턴스에 동적으로 속성을 추가할수가 있다.
  17. 속성 바인딩 30  __setattr__(‘name’, ‘y4’)  __delattr__(‘name’)  __getattr__(‘name’)

    __dict__ 수정, 삭제, 변경  모두 내부 함수에 의해서 __dict__에서 관리된다.
  18. __slots__ 31 인스턴스에 할당할 수 있는 속성이름이 __slots__ 에 지정한

    것으로 제한됨. 인스턴스에서 새 속성 추가 막는 역할, 이러한 목적으로는 잘 안쓴다고 함 __dict__ X => 배열에 기초한 다른 데이터구조에 저장( 메모리/성능 ↑)  상속에서의 문제 - __slots__를 사용하는 클래스를 상위-기반 클래스로 둔 자식-서브 클래스는 __slots__를 내부에서 정의해야한다. 정의하지 않으면 더 느려지고, 더 메모리도 많이 사용.
  19. 추상 기반 클래스 32  TypeError: Can't instantiate abstract class

    Student with abstract methods name 클래스를 계층적으로 구성, 메서드/속성 강제 하고 싶을때. (자바의 인터페이스) abc 모듈 사용, __metaclass__ = ABCMeta 지정 필수 자식-서브 클래스에서 구현 메소드/속성을 만들지 않으면 인스턴스 생성오류
  20. 추상 기반 클래스 33 자식-서브 클래스의 구현하는 메소드는 인자나 반환

    타입이 같은지는 검사하지 않는다. 오로지 이름!! 이름만 같으면 된다.
  21. 모듈 35  모듈의 3단 구문 [from 모듈(파일이름)] import 모듈

    or 함수명 or 클래스명 [as 별명] 모듈 = 파이썬 소스코드 = 파이썬 파일(*.py) person.py => person 이라는 “모듈” from 절과 as 절은 생략 가능하다. import 는 실제 모듈 혹은 모듈 내 함수, 클래스를 지정하는 역할 사용하는 어디서나 쓸 수 있다. 꼭 맨 위에 쓸 필요는 없다.
  22. 모듈 36 person.py student.py 제일 기본적인 형태 모듈 전체를 가져오는

    방식. 사용할 때 모듈.함수명, 모듈.클래스명으로 접근
  23. 모듈 37 person.py student.py 가장 많이 사용하는 방식 모듈 person

    에서 Person 클래스를 가져온다 라는 의미 사용할때 그냥 함수명 또는 클래스명을 사용 from person import * => person 모듈 안에 있는것을 다 쓸거다.
  24. 모듈 39 모듈의 참조 위치, 파이썬은 어디에 있는 모듈(파일)을 인식할까?

    [ 'C:\\workspace', 'C:\\Python27\\lib\\site-packages\\setuptools-0.6c11-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\html2text-3.200.3-py2.7.egg', 'C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages‘ ] sys.path 를 이용해서 현재 파일이 import 하는 위치를 알수 있다. 기본 지정 디렉토리 외에 현재 파일이 있는 위치는 기본으로 들어간다.
  25. 모듈 40 person.py 가 lib 디렉토리 아래에 있다면? 찾지 못하는

    문제 발생, 그렇다고 다 현재 디렉토리에 둘수는 없는데? Traceback (most recent call last): File "C:\workspace\study\student.py", line 1, in <module> from person import Person ImportError: No module named person
  26. 모듈 41 사용해야 하는 모듈을 가져오기 전에 경로를 추가해 주자.

    ['C:\\workspace\\study', 'C:\\Python27\\lib\\site-packages\\setuptools-0.6c11-py2.7.egg', 'C:\\Python27\\lib\\site-packages\\html2text-3.200.3-py2.7.egg', 'C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages', 'lib']
  27. 패키지 42 모듈의 모음 = 파이썬 파일의 디렉토리 패키지로 인식

    => __init__.py 가 디렉토리 내에 있어야 한다. 없으면 걍 디렉토리  __init__.py 에 있어야 할 내용 - __all__ : import * 했을때 어떤 모듈을 import 할것인지 지정 - __version__ : 패키지 버전 지정 - import 문 : 이 패키지에 어떤 모듈 혹은 하위패키지를 넣을것인지 지정.
  28. 패키지 43 food breakfast.py lunch.py dinner.py meat beef.py pork.py plant

    fruit apple.py vegetable food 라는 패키지를 만든다고 할때.. __init__.py __init__.py __init__.py __init__.py __init__.py
  29. 패키지 44 /food/__init__.py “import * 을 통해서 사용하는 모듈 및

    하위패키지는 breakfast, dinner, lunch, meat, plant 이고, 그것들의 위치는 다음과 같다” 상대경로로 지정, 현재 디렉토리에 있는 breakfast, lunch, dinner 모듈과 meat, plant 패키지를 포함한다.
  30. 패키지 45 /food/meat/__init__.py /food/plant/__init__.py /food/plant/fruit/__init__.py 각 패키지(디렉토리) 내의 __init__.py 에서

    현재디렉토리에서 import 할것을 지정 해 놓는다. 상위에서 하위로 연결해 나가는 방식
  31. 패키지 46 food 하위 모듈로 접근 meat, plant 등 패키지로

    지정된 디렉토리를 통해서 접근 plant/__init__.py 에 정의 되지 않았기 때문에 인식 오류 발생
  32. 배포하기 47 setup.py 작성 최상위 디렉토리에서 만든다. food 디렉토리와 같은

    위치 disturils : 파이썬 프로그램 배포와 설정시 사용 packages : 패키지 포함을 하려면 지정해야 함. : 하위패키지도 지정 필요 setup 스크립트 : https://docs.python.org/2/distutils/setupscript.html
  33. 배포하기 49 site-packages 에 포함되기 때문에 어떤 파이썬 파일에서도 접근할수

    있다. 왜? site-packages 디렉토리는 sys.path 에 기본적으로 들어가는 디렉토리이기 때문. sys.path 에 들어가는 디렉토리에 있는 것만 import 가능
  34. 정리 50 클래스 내부에서 호출시 무조선 self. 모든것이 public 오버로딩

    안됨. 연산자 오버로딩만 가능 인스턴스에 속성을 동적으로 추가, __dict__ vs. __slots__ 추상클래스 상속시, 이름만 같으면 구현됨. from … import … as 만 기억하자. 모듈은 파이썬파일(*.py), 패키지는 디렉토리. 패키지는 __init__.py