본문 바로가기
python

python - Class member, Class method

by orangecode 2022. 4. 29.
728x90
클래스 멤버(Class member)

Class Member : class에 소속되어있는 변수와 메소드를 말한다.

year라는 method는 각각의 method가 누구의 소속이냐에 따라서, 

 

소속된 instance의 내부값을 이용해서 결과를 return해 준다.

 

각각의 method는 각각의 instance에 소속되어있음을 알 수 있다.

 

 

class method VS instance method 차이?

year() method는 d1, d2에 소속되어 있지만,

 

today() method는 Date(class)에 소속되어있다.

 

instance 내부적으로 어떠한 정보/데이터를 가지고 있다.

d1, d2의 차이점은 데이터의 상태가 다른 것이다.

 

 

today()는 어떤 instance에 소속되지 않았기에, Date라는 class에 소속된다

 

instance member X, Class member O

 

 

Instance에 따라 다르게 동작해야하는 method는 instance member 로 만들고,

Instance 내부적인 데이터와 상관없이 동작하는 method는 class member로 만든다

 

클래스 매소드(Class method)
class Cs:
    @staticmethod # 장식자, 꼭 붙여주어야함
    def static_method():
        print("Static method")
        
    @classmethod # 장식자, 꼭 붙여주어야함
    def class_method(cls): # cls라는 첫번째 매개변수를 가져옴.
        print("Class method")
        
    # instance method    
    def instance_method(self): #
        print("Instance method")



i = Cs()
Cs.static_method()
Cs.class_method()
i.instance_method()

정적메소드(class method, staticmethod)

: 정적메소드는 클래스에서 직접 접근할 수 있는 method이다. 

 

classmethod는 첫번째 인자로 class를 입력한다.

staticmethod는 특별히 추가되는 인자는 없다.

 

1) instance method

class Cs:
	# instance method
	def instance_method(self, a, b): 
        return a+b
        
i = Cs()
i.instance_method(self, a, b)

instance method 내부에서 인스턴스 변수를 접근할 경우, 첫번째 인자에 객체를 할당한다.

 

2) classmethod

class Cs:
	@classmethod
	def class_method(cls, a, b):
    	return a + b

i = Cs()
i.class_method(cls, a, b)

첫번째 인자 cls넣고, 인자를 넣는다.

 

3) staticmethod

class Cs:
	def static_method(a, b)
    	return a+b
        
i = Cs()
i.static_method(a, b)

static_method는 바로 접근해서 사용이 가능하다.

static method vs class method : 상속의 차이

 

- static method : 부모 클래스의 method를 가져온다.

 

- class method : cls 인자를 활용한 class의 class 속성을 가져온다

 

클래스 변수

 

 

i2 = Cs()을 실행시키면, 아래와 같은 오류가 발생함

AttributeError: type object 'Cs' has no attribute 'count'

 

Cs object는 count라는 attribute(변수)를 가지고 있지 않다는 뜻...

 

 

현재 Cs.count가 사용은 하고 있으나 되어있으나, Cs.count의 값은 명확하게 정의되어 있지 않아 발생한 오류이다.

 

class의 안, method의 밖에 count = 0 이라는 변수를 선언한다.

 

count = 0class에 소속된 변수로 정의되었고,

Cs.countmethod 내부에서 class 변수를 호출하는 방법이다.

 

 

classmethod로 정의한 getCount는 첫번째 인자(매개변수) clsmethod가 소속된 class가 가르키는 값을 첫번째 인자로 주어야함.

 

클래스 멤버의 활용
class Cal(object):
    _history = [] # _history 정의
    def __init__(self, v1, v2): # v1, v2 : __init__내부에서만 사용가능한 지역변수
        if isinstance(v1, int):
            self.v1 = v1
        if isinstance(v2, int):
            self.v2 = v2  

    def add(self):
        result = self.v1 + self.v2 # result 변수 정의
        Cal._history.append("add : %d+%d=%d" % (self.v1, self.v2, result) ) # Cal class의 _history 변수에 추가함
        return result

    def subtract(self):
        result = self.v1 - self.v2
        Cal._history.append("subtract : %d+%d=%d" % (self.v1, self.v2, result))
        return result

    def setV1(self, v):
        if isinstance(v, int): 
            self.v1 = v 

    def getV1(self):
        return self.v1


    @classmethod # classmethod
    def history(cls): # 첫번째 인자는 cls로 정의
        for item in Cal._history: # _ = 내부에서만 사용할 변수
            print(item)

 

반응형

댓글