29일차 파이썬 백신개발 -4

2020. 9. 28. 16:00Diary/1~100

----------------------------------------------

PY3 = sys.version_info.major == 3

 

# PY3은 파이썬 3.xx 버전을 뜻한다.

 

sys.version :  현재 파이썬 인터프리터의 사람이 읽을 수 있는 버전정보가 포함 된 문자열을 반환한다. 그러나 '주 릴리스 번호' 및 '마이크로 릴리스 번호'와 같은 정보는 코드에서 추가로 사용하기 위해서 추가 처리가 필요하다.

 

sys.version_info : 버전 정보를 명명 된 튜플로 반환하여 이 문제를 쉽게 해결한다.
- 반환되는 버전 데이터 -
majar : 주요 출시 번호
micro : 패치 릴리스 번호
minor : 부 릴리스 번호
releaselevel : '알파' , '베타' , '후보자' 또는 '릴리스
serial : 일련 번호

----------------------------------------------

if PY3:
    basestring = str

 

# 만약 파이썬 버전이 3.xx라면, basestring은 str 클래스이다.

 

basestring : 이 추상 유형은 str및 유니코드의 수퍼 클래스다. 호출하거나 인스턴스화 할 수 없지만 객체가 str또는 유니코드의 인스턴스인지 여부를 테스트하는 데 사용할 수 있다. 
예시) isinstance(obj, basestring)isinstance(obj, (str, unicode))

 

str : String은 글자의 Unicode 코드로 이루어진 불변한 순서있는 집합입니다.

----------------------------------------------

def is_storage(item):
    return hasattr(item, '__iter__') and hasattr(item, '__getitem__')

# hasattr (obj : Any, 이름 : str) -> bool

객체에 주어진 이름의 속성이 있는지 여부를 반환한다. 이는 getattr (obj, name)을 호출하고 AttributeError를  포착하여 수행된다.

 

# bool (int). bool은 논리형이며 True, False(참, 거짓)을 판별한다. bool (x)-> bool 인수 x가 참이면 True를 반환하고 그렇지 않으면 False를 반환합니다. 내장 True와 False는 bool 클래스의 유일한 두 인스턴스이다. bool 클래스는 int 클래스의 하위 클래스이며 하위 클래스가 될 수 없다.

 

# __iter__ : 반복자를 반환한다. __iter__() 메서드를 사용하여 이터레이터(iterator)를 쓸 수 있도록 설정한다. 이터레이터란, 값을 한 개씩 순서대로 꺼낼 수 있는 구조를 갖춘 오브젝트 사용자가 정의한 클래스가 이터레이터를 지원하려면 __iter__() 메쏘드를 정의하면 된다. iter()는 객체의 __iter__() 메쏘드가 돌려주는 값을 이터레이터로 사용한다. next()에 이터레이터를 전달하면 이터레이터의 __next__() 메쏘드를 호출한다. 때문에 최소한의 이터레이터는 이렇게 구성할 수 있다.

 

# __getitem__ : 특정 object에 [] 연산자를 사용하면 내부적으론 __getitem__이라는 메소드가 실행된다. 예를 들어서 arr[1] 이라고 했다면 arr.__getitem__(1) 과 같이 변경되는 것이다.

 

# 즉, is_storage(item) 함수는 hasattr 객체에 '__iter__'와 '__getitem__' 속성이 있는지 참, 거짓을 판별하고 반환한다.

----------------------------------------------

def is_stream(item):
    return hasattr(item, 'open') and callable(item.open)

 

# callable(item.open) : callable(object)은 전달받은 object 인자가 호출 가능한지 여부를 판단한다. __builtin__ module에 포함된 function 이다. 

# argument : object - 호출 가능 여부를 판단할 object 인자 하나를 넘겨준다.

# return value : 인자로 전달받은 object가 호출 가능한 object일 경우 True, 아닐 경우 False를 반환한다.

 

# 즉, is_stream(item)함수는 hasattr 객체에 'open' 속성이 있는지 참, 거짓을 판별하고 
item.open을 호출할 수 있는지 확인한다.

----------------------------------------------

class ItemWrapper(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped

    def __getattr__(self, name):
        return getattr(self.wrapped, name)

 

# object : builtins 클래스 객체이다. 클래스 계층 구조의 기본 클래스이다. 호출되면 인수를받지 않고 인스턴스 속성이 없고 어떤 것도 제공 할 수없는 새로운 기능없는 인스턴스를 반환한다.
   
# __init__ : init(생성자)는 초기화(initialize) 메서드. __init__을 사용하면 클래스명을 쓰고 옆에 바로 인자들을 채워 넣음으로써 그 값들을 지닌 객체를 만들어 낼 수 있다. 파이썬에서는 클래스에서 사용하는 함수의 첫번째 인자(parameter)를 self로 사용하는 것이 원칙입니다.

# __getattr__ : __getattr__는 인스턴스에 해당 attribute가 없을경우 호출된다. 즉, 다 찾아봐도 없으면 __getattr__를 호출하게 된다.(인풋인자로 해당 attribute를 넘겨주면서) 쉽게말해 제일 “후순위”로 호출되는 녀석이라 볼 수 있다.

# getattr : getattr(object, name[, default]) = object에 존재하는 속성의 값을 가져온다.

 

# __getattribute__ : (해당 속성이 있든 없든) 가장 “선순위”로 호출된다.
  __getattr__    : (해당 속성를 찾을 수 없을경우) 가장 “후순위”로 호출된다고 이해할 수 있다.
 
# ItemWrapper(object)라는 class(붕어빵틀)을 만든다. 그 class에는 __init__ 함수와 __getattr__ 함수가 있다. 사용자는 __init__(생성자)를 이용해서 wrapped 인자를 넣어서 인스턴스(붕어빵)을 찍어낸다. __getattr__라는 함수도 있는데 이는 self.wrapped 오브젝트의 name의 값을 받아오는 것이다.
  
# 즉, ItemWrapper(object)는 self.wrapped 의 name 값을 가져오는 클래스다.

----------------------------------------------

# 인스턴스란 클래스에 의해 만들어진 객체를 칭하는 말이다. 예를 들어 클래스를 붕어빵 틀이라고 한다면, 인스턴스는 붕어빵이 되는 것이다. 즉, 클래스는 인스턴스를 만드는 하나의 틀입니다. 앞으로 클래스를 이용하여 인스턴스를 계속적으로 만들어 낼 수 있다.
  class 클래스이름(기반클래스이름)

----------------------------------------------

class StorageWrapper(ItemWrapper):
    def __iter__(self):
        return iter(self.wrapped)

    def __getitem__(self, name):
        return self.wrapped[name]

 

# StorageWrapper는 ItemWrapper클래스를 기반으로 가지는 클래스이다.
# self.wrapped의 값을 1개씩 꺼내온다.
# self.wrapped[name]의 속성 값을 가져오는데, 속성을 찾을 수 없을 경우 가장 후순위로 호출한다.

'Diary > 1~100' 카테고리의 다른 글

31일차 파이썬 백신개발 -6  (0) 2020.09.30
30일차 파이썬 백신개발 -5  (0) 2020.09.29
28일차 파이썬 백신개발 -3  (0) 2020.09.27
27일차 Code Up 문제풀이  (0) 2020.09.26
26일차 Code Up 문제풀이  (0) 2020.09.25