언어/파이썬 & 장고
-
[Django] settings.py 데이터 호출언어/파이썬 & 장고 2016. 12. 1. 13:12
from base.settings.py import DATABASES 와 같이 하지 않은 이유는 settings.py이 분리가 될 수도 있고 위치가 바뀔 수도 있기 때문에 아래와 같이 호출하는 것이 좋습니다. from django.conf import settings print(settings.DATABASES['default']['NAME']) print(settings.CACHES) # settings.py에 정의되어 있는 databases의 default name 정보와 caches의 정보가 출력
-
[Python] Tip - 메타클래스로 서브클래스를 검증언어/파이썬 & 장고 2016. 11. 26. 17:48
메타클래스를 응용하는 가장 간단한 사례는 클래스를 올바르게 정의했는지 검증하는 것입니다. 복잡한 클래스 계층을 만들 때 스타일을 강제하거나 메서드를 오버라이드하도록 요구하거나 클래스 속성 사이에 철저한 관계를 두고 싶을 수도 있습니다. 메타클래스는 서브클래스가 정의될 때마다 검증 코드를 실행하는 신뢰할 만한 방법을 제공하므로 이럴 때 사용할 수 있습니다.보통 클래스 검증 코드는 클래스의 객체가 생성될 때 __init__ 메서드에서 실행됩니다. 메타클래스를 검증용으로 사용하면 오류를 더 빨리 일으킬 수 있습니다.서브클래스 검증용으로 메타클래스를 정의하는 방법을 알아보기에 앞서 메타클래스가 표준 객체에는 어떻게 동작하는지 이해해야 합니다. 메타클래스는 type을 상속하여 정의합니다. 메타클래스는 기본으로 자..
-
[Python] Tip - 지연 속성에는 __getattr__, __getattribute__, __setattr__을 사용언어/파이썬 & 장고 2016. 11. 26. 17:22
파이썬의 언어 후크를 이용하면 시스템들을 연계하는 범용 코드를 쉽게 만들 수 있습니다. 예를 들어 데이터베이스의 row를 파이썬 객체로 표현한다고 할 때, 데이터베이스에는 스키마 세트가 있습니다. 그러므로 로우에 대응하는 객체를 사용하는 코드는 데이터베이스 형태도 알아야 합니다. 하지만 파이썬에서는 객체와 데이터베이스를 연결하는 코드에서 로우의 스키마를 몰라도 됩니다. 코드를 범용으로 만들면 됩니다.사용하기에 앞서 정의부터 해야하는 일반 인스턴스 속성, @property 메서드, 디스크립터로는 이렇게 할 수 없습니다. 파이썬은 __getattr__이라는 특별한 메서드로 이런 동작을 가능하게 합니다. 클래스에 __getattr__ 메서드를 정의하면 객체의 인스턴스 딕셔너리에서 속성을 찾을 수 없을 때마다 ..
-
[Python] \xef\xbb\xbf 제거언어/파이썬 & 장고 2016. 11. 3. 14:10
윈도우에서 내린 csv파일을 파이썬에서 읽어들일 때 맨 첫 번째 줄에 \xef\xbb\xbf 이 붙어 있는 것을 확인할 수 있습니다. 이것은 UTF8-BOM이라는 것을 나타내는 문자열입니다. 파이썬에서는 다음과 같이 해당 문자열을 출력하지 않고 파일을 읽어들일 수 있습니다.import codecs with codecs.open("file.txt", "r", encoding="utf-8-sig") as f: for line in f: # ... 만약 파이썬 버전이 2.7 이상이라면 codecs보단 io를 사용하는 것을 권장합니다. (빠르고 더 정확함)import io with codecs.open("file.txt", "r", encoding="utf-8-sig") as f: for line in f: #..
-
[Python] Tip - 재사용 가능한 @property 메서드에는 디스크립터를 사용언어/파이썬 & 장고 2016. 10. 29. 17:42
파이썬에 내장된 @property의 큰 문제점은 재사용성입니다. 다시 말해 @property로 데코레이트하는 메서드를 같은 클래스에서 속한 여러 속성에 사용하지 못합니다. 또한 관련 없는 클래스에서도 재사용할 수 없습니다.class Homework: def __init__(self): self._grade = 0 @property def grade(self): return self._grade @grade.setter def grade(self, value): if not (0
-
[Python] Tip - 게터와 세터 메서드 대신 일반 속성을 사용언어/파이썬 & 장고 2016. 10. 29. 16:21
다른 언어의 경우 게터와 세터 메서드를 명시적으로 구현하여 사용합니다. 하지만 파이썬에서는 명시적인 게터와 세터를 구현할 일이 거의 없습니다. 클래스의 변수들의 접근제어자를 public으로 할 경우 쉽게 접근할 수 있습니다. 또한 나중에 속성을 설정할 때 특별한 동작이 일어나야 하면 @property 데코레이터와 이에 대응하는 setter 속성을 사용하는 방법으로 바꿀 수 있습니다. class Resistance: def __init__(self): self._data = 10 @property def data(self): return self._data @data.setter def data(self, val): self._data = val self.current = self._data * 10 re..
-
[Python] 메타클래스와 속성언어/파이썬 & 장고 2016. 10. 29. 16:07
메타클래스는 파이썬의 기능목록에서 자주 언급되지만 실제로 메타클래스가 무엇을 하는지 이해하는 사람은 소수에 불과합니다. 메타클래스라는 이름은 어렴풋이 클래스 위에 있고 클래스를 넘어선다는 개념을 암시합니다. 간단히 설명하면 메타클래스를 이용하면 파이썬의 class문을 가로채서 클래스가 정의될 때마다 특별한 동작을 제공할 수 있습니다.속성 접근을 동적으로 사용자화하는 파이썬의 강력한 내장 기능이 있습니다. 파이썬의 객체 지향 구조와 함께 이용하면 이 기능들은 간단한 클래스를 복잡한 클래스로 쉽게 바꿔주는 훌륭한 도구가 됩니다.그러나 이런 강력한 기능에는 많은 함정이 있습니다. 동적 속성은 객체들을 오버라이드하다가 예상치 못한 부작용을 일으키게 할 수 있습니다. 메타클래스는 처음 접하는 사람은 도저히 이해할..
-
[Python] Tip - 공개 속성보다는 비공개 속성을 사용언어/파이썬 & 장고 2016. 10. 29. 16:01
파이썬에는 클래스 속성의 가시성(visibility)이 공개(public)와 비공개(private) 두 유형밖에 없습니다.class MyObject: def __init__(self): self.public_field = 5 self.__private_field=10 def get_private_field(self): return self.__private_field foo = MyObject() assert foo.public_field == 5 assert foo.__private_field == 10 # 에러 클래스 메서드도 같은 class 블록에 선언되어 있으므로 비공개 속성에 접근할 수 있습니다.class MyObject: def __init__(self): self.__private_field..
-
[Python] hasattr()언어/파이썬 & 장고 2016. 10. 29. 14:56
hasattr(object, name)Object내에 name에 해당하는 attribute가 있으면 True, 없으면 False를 리턴.class foobar(): data = [1, 2, 3, 4] def __init__(self, val): self.val = val >>> x = foobar >>> y = foobar(['a', 'b']) >>> z = foobar([1, 2]) >>> hasattr(x, 'data') True >>> hasattr(y, 'data') True >>> hasattr(x, 'val') False >>> hasattr(y, 'val') True >>> delattr(x, 'data') >>> hasattr(x, 'data') False >>> hasattr(y, 'da..
-
[Python] isinstance()언어/파이썬 & 장고 2016. 10. 29. 14:53
isinstance(1, int) # 1이 int형인지 알아봅니다. 결과는 True 입니다. isinstance(1.2, float) # 1.2가 float형인지 알아봅니다. 결과는 True 입니다. isinstance(1.2, int) # 1.2가 int형인지 알아봅니다. 결과는 False입니다. isinstance("hi", str) "hi"가 스트링인지 알아봅니다. 결과는 True입니다. isinstance(mylist, list) # mylist가 list형인지 알아봅니다. 결과는 True입니다. simclass = CSimple() isinstance(simclass, CSimple) # simclass가 CSimple 클래스인지 확인합니다. 결과는 True입니다.