2011년 8월 22일 월요일

파이썬 클래스 property


파이썬 클래스 중에서 property라는 것에 대해서 살펴보겠습니다.

property는 데코레이터로 들어갑니다.

property는 실제모양을 보면 attribute와 거의 유사하지만,

차이점은 실제 데이터를 access 할때 그 값을 계산을 합니다.


import math
class Rectangle(object):
    
    def __init__(self,r):
        self.r = r
    
    @property
    def area(self):
        return self.r*self.r
    
    @property
    def sqrt(self):
        return self.r*math.sqrt(2)
  
a = Rectangle(4)
    
print a.area  # 16 
print a.sqrt  # 5.65685424949
    
a.area = 1  # AttributeError: can't set attribute
   
        

여기서 보시면 a.r 은 attribute입니다 읽기, 쓰기가 모두 됩니다.
반면에 a.area랑 a.sqrt는 읽기만 되고, 또, 호출할때 그 값을 계산을 합니다.

그래서 이것을 보완 하기 위해서 setter와 deleter에 access가 가능합니다.

원래는 property를 class에 추가하기 위해서 getter, setter, deleter를 추가하던 방식에서
간단히 decorator를 이용한 방식으로 변경이 된것입니다.


2011년 8월 15일 월요일

파이썬 클래스 staticmethod vs classmethod

staticmethod는 C++의 의 그것과 동일합니다.

class는 그냥 이름만 빌려준것이고 일종의 namespace로 함수를 구현하는 것이고

instance에서는 실행되지 않습니다.

아래와 같이 일종의 utility task들을 한쪽에 몰아넣고 쓸데나
class UTIL:
	@staticmethod
	def addtask(a,b):
		return a+b

x = UTIL.addtask(1,4) # x = 5



또는 init구문으로들 많이 사용합니다.

init 구문이 복수개로 들어가는 경우, 일종의 편법으로 생성을 해서 자기자신을 리턴합니다.

아래가 좋은 예제입니다.

import time

class Date(object):
	
	def __init__(self, year, month, day):
		self.year = year
		self.month = month
		self.day = day

	@staticmethod
	def now():
		t = time.localtime()
		return Date(t.tm_year, t.tm_mon, t.tm_day)

# example

a = Date(2011,8,14)
b = Date.now()



classmethod는 인자로 클래스 자기자신을 받게 되어있습니다. 관습적으로 cls라고 표기를 합니다.

그래서 instance에서 호출을 하면, class을 인자로 넘겨주게 됩니다.

class Times(object):

	factor = 1
	@classmethod
	def mul(cls, x):
		return cls.factor*x

class TwoTimes(Times):
	factor =2 
	

x = TwoTimes.mul(4) # Calls Times.mul(TwoTimes, 4) --> 8


이둘은 데코레이터로 구현이 되어있습니다.