목록파이썬/윤성우의 열혈 파이썬 중급편 (23)
개발자 블로그

개발을 하다보면 import를 사용할 일이 정말 많다. 해당 파일에서 다른 파일에 있는 객체를 가져와 사용하고 싶을 때, 물론 사용할 객체를 한 파일에 있으면 import를 사용할 일은 없다. 하지만 서비스와 비즈니스 모듈을 나누고 또 테스트를 사용하고 등등 여러가지 이유로 우리는 여러 파일을 나누고 불러와 사용하는 일이 빈번하다. 그럴 때 의도하지 않는 것도 실행이 될 수도 있다. 해당 파일에 필요한 것만 가져와 사용하고 싶은데... 그럴 때 __name__ 이란 변수의 성질을 잘 알고 사용한다면 우리는 이러한 불편함을 해결할 수 있다. __name__ 란? __name__은 파이썬 파일을 실행하면 자동으로 생성이 되는 변수이다. 그렇다면 이 변수에는 뭐가 참조되고 있을까... 바로 '__main__'..

클래스 메소드와 static 메소드를 이해하기 전에 클래스 변수와 인스턴스 변수에 대한 이해를 하고 넘어가자! 클래스 변수: 클래스 내부의 변수로 self(객체)로 전달받지 않는다.(클래스에 속한 변수) 클래스 내부에 직접적으로 연결되어 있고, self를 인자로 받지 않고 변수 명 그대로 쓰인다. 인스턴스 변수: 객체 안에 있는 변수로 self(객체)에 의해 전달받은 변수.(객체에 속한 변수) 보통 클래스 안의 메소드 내부에 있음. ex) self.name = 'hayongwoon' 둘의 차이는 실제로 값에 접근을 할 때에도 있다. 클래스 변수의 경우 '클래스이름.변수명' 으로 접근 가능하고, 객체를 생성해서 '객체.변수명'으로도 접근이 가능 하지만, 인스턴스 변수의 경우 객체를 만들어야만 객체이름으로 ..

지난 글에서 네스티드 함수와 클로져 테크닉을 공부했다. 그래서 데코레이터를 기술을 더 쉽게 이해할 수 있었다. 데코레이터는 단순히 함수 위에 '@데코네임'을 붙여 붙인 함수에 대해 부가적인 기능이나 제한을 뒀을 때 사용하곤 했다. 기술적인 부분을 살펴보면 우선 데코레이터 아래 들어가는 함수가 데코레이터 함수의 네스티드 함수가 된다. 즉, 데코레이터 아래 함수를 인자로 받아 함수를 반환하는 기술이 데코레이터의 원리이다. @deco는 아래 함수를 데코레이터 deco 함수에 통과시켜라! 라고하는 말, 두 이미지는 같은 결과를 내지만 더욱 간결하다!

함수를 만들어서 반환하는 함수, 파이썬은 모든 것이 객체이기에 함수를 반환하는 함수를 만들 수 있다. 따라서 함수 안에 정의 된 함수를 네스티드 함수라고 한다. 여기서 m이라는 변수를 잘 살펴보자. f1이라는 객체를 만들 때, m=2라는 변수에 참조했다. 그리고 다시 f1(7)이라고 했는데, 네스티드 함수의 안을 보면 변수 m에 대해 따로 정의한 것이 없다. 그런데 네스티드 함수에서 어떻게 밖에 있는 변수를 참조해서 가져올까? 바로 클로저라는 테크닉을 사용한다고 한다. 정리 네스티드 함수 - 함수 안에서 정의 된 함수 클로저 - 네스티드 함수 밖에서 정의 된 변수를 참조하여 사용할 때 쓰는 기술 보다시피 다소 복잡한 곳에 따로 저장을 해둔 것을 확인 할 수 있다. 클로져라는 변수의 0번 째 인덱스 안의 ..

객체가 갖는 값에 직접 접근하는 것은 쉽게 오류를 범할 수 있으므로 지양해야한다 때문에 객체의 변수에 직접 접근을 하기보다 메소드를 통해 접근하는 것이 안전하다! 하지만, 메소드를 통해 접근을 하다보면 코드가 다소 복잡해 보일 수 있다. 따라서 우리는 안전성과 간결함 이 두마리 토끼를 잡고자 프로퍼티라는 개념을 배워야한다. 메소드를 통한 객체의 값에 접근 객체의 어트리뷰트의 직접 접근을 막는 방법으로 변수 앞에 __를 붙였다. 따라서 우리느 메소드를 통해 변수에 접근을 해야한다. 아래 두개의 메소드를 통해 값을 저장 및 참조하도록 하자! 1) getter(게터) 값 꺼내기, 이러한 성격의 메소드를 게터라한다. 2) setter(세터) 값 수정하기, 이러한 성격의 메소드를 세터라고 한다. n2의 값과 n3..

__slots__의 효과 앞서 블로깅을 통해 __dict__에 대해 알아보았다. 우리는 클래스를 생성할 때, 클래스 속성을 담는 딕셔너리가 생성된다는 것을 확인했다. 그리고 이러한 딕셔너리(변수를 담고 있는)를 통해 값을 수정하고 추가한다는 것도 확인했다. 하지만 해당 클래스의 객체를 생성할 때마다 딕셔너리가 생성이 되는데, 이러한 점 때문에 다소 상황에 따라 무수히 많은 객체를 생성해야 할 때 우리는 메모리상 큰 불이익을 얻을 수 있다. 객체마다 딕셔너리가 함께 생성되기 때문! (*딕셔너리는 키를 통해 값을 얻는 구조로 파이썬에서는 더 많은 정보를 갖고 있어 메모리가 적지 않다.) 메모리 상의 이득 이러한 부분을 보완하기 위해 나온 것이 __slots__이다. __slots__를 통해 변수를 등록해 두..

속성 감추기 개발을 하다보면 그리고 다른 사람과 협업을 하다 보면 바뀌지 않아야 할 값들이 바뀔 가능성은 항상 존재한다. 그래서 이를 바꾸면 안되는 것이라고 약속하는 방법과 실제로 정보를 숨김으로써 정보에 직접 접근을 막는 방법을 소개하겠다. 1. _속성이름 언더바(_) 한개 일 때이다. 이는 기능상으로는 변화는 없지만 개발자들끼리 약속한 관습이라고 할 수 있다. 속성 이름 앞에 _가 한개 존재한다면 이 값은 우리가 직접 접근을 하면 안된다! 라고 약속을 한 것과 같다. 따라서 접근은 가능하나 아래 언더바가 한개 존재한다면 이 속성은 직접 접근을 하지 않겠다고 약속한 것이다. 2. __속성이름 언더바(_) 두개일 때이다. 이는 실제로 속성에 직접 접근하는 못하게 막는 방법이다. 정확히는 못하게 한다기 보..
연산자 오버로딩이란? 클래스에서 상속시 사용되는 오버라이딩이란 개념이랑 다른 개념이다! 오버라이딩은 상속할 때 상속받은 메소드를 덮어 씌어서 새로운 메소드로 동작하도록 하는 것이고, 오버로딩은 하나의 메소드에 다양한 형태를 부여한 것이라고 말할 수 있다. 그러다 보니 오버로딩이란 개념에 대해 부정적으로 생각하는 개발자들이 많다고 한다! 왜냐면 다형성이 주는 부정적인 측면이 많기 때문! 오류가 났을 때 원인을 찾기 어렵다던가, 코드가 복잡해지는 것을 초래할 수 있다는 점에서 말이다. 미리 약속해 놓은 메소드가 호출 되도록하는 것이 연산자 오버로딩! 예를 들어 '+' -> __add__(), '-' -> __sub__() 이 호출되는 것인데, __add__()를 기존과 다르게 재정의하면, +연산자를 호출하면..
스페셜 메소드란? 객체를 불러올 때 자동으로 호출이 되는 메소드이거나 간접적(다른 경로를 통해)으로 호출할 수 있는 메소드를 가리켜 스페셜 메소드라고 한다. 대표 적으로 __init__ 메소드가 있다! 이는 객체를 생성할 때 자동으로 호출이 되는 메소드이다! 또 우리가 많이 사용하는 len, iter, str 도 사실은 원래 a.__len__(), a.__iter__(), a.__str__() 이렇게 생긴 메소드이나 우리가 알고있는 것 처럼 간접적으로 호출을 한다! 직접 스페셜 메소드를 만들어보면서 파이썬의 이해도를 높여보자! 1. iterator 객체가 되게끔 하기! 2. 1번을 성공했으면, 좀 더 수정해서 iterator 객체이면서 iterable 객체가 되게끔 해보자! *iterator 객체: ne..

isinstance 함수 isinstance(object, classinfo) 객체의 클래스 유형을 확인하는 함수! 첫 번째 인자는 객체, 두 번째 인자는 클래스이다! "이 객체가 저 클래스의 객체인가??"할 때 쓰는 함수! * 추가로 해당 객체가 직접 또는 간접적으로 상속 받은 클래스인 경우에도 True를 반환!! Object 클래스 객체 클래스?? 말이 뭔가 이상하다... 이 말은 즉, "파이썬의 모든 클래스는 object 클래스를 직간접적으로 상속한다."라는 사실을 알아야 한다. issubclass(class1, class2) 함수를 통해서도 살펴보자! (->class1은 class2를 상속 받았는가?) 이렇듯 파이썬의 모든 클래스는 object 클래스를 상속하고 있다! >>> dir(object..