클래스 (class) 두번째 이야기. 속성 (attribute), 메서드(method)

포도·2021년 7월 16일
0
post-thumbnail

오늘은 class 안에 사용되는 속성(attribute) 과 메서드 (method)에 대해서 좀 더 살펴보려 한다.

1. 속성

속성에는 두가지 종류가 있다 - 클래스, 인스턴스.

클래스 기초에서 사용했던 코드를 가져와서 cat_attribute 라는 속성을 추가해 줬다.

class Cat:

	cat_attributes = ['귀여움','도도함','독립적임']

podo = Cat()
lola = Cat()

cat_attribute는 클래스 속성이다. 클래서 안에서 정의되어 있는 속성. 이 속성은 다양한 방법으로 호출될수 있다.

  • Cat.cat_attributes - 클래스 이름. 클래스속성
  • podo.cat_attributes - 인스턴스1 이름. 클래스속성
  • lola.cat_attributes - 인스턴스2 이름. 클래스속성

모두 결과값은 ['귀여움','도도함','독립적임']

그럼 인스턴스 속성은 무엇일까? 왜 두개를 구분해 줄까?

인스턴스 속성은 각 인스턴스를 위한 속성을 따로 만들어 주고 싶을때 사용한다. 예를들어 모든 고양이의 특징이 아니고 각 고양이들의 특징을 얘기하고 싶을때.

class Cat:
	
    def __init__(self): 
		self.attributes = []
    
    def add_attribute(self, character):
    	self.attributes.append(character)

podo = Cat()
lola = Cat()

podo.add_attribute('통통하다') 
lola.add_attribute('외출을즐긴다')

lola.attributes, podo.attributes

결과: (['외출을즐긴다'], ['통통하다'])

lola 고양이는 외출을 즐기고 podo고양이는 통통하다라는 특성을 따로 attributes라는 속성에 저장하고 불러왔다.

2. 정적메서드 (static method)

정적메서드. 메서드 중에서 특정한 기능을 가지고 있는 method 라고 추측해 볼 수 있다.

class Cat:
    @staticmethod ---> 중요함!
    def food(x,y):
        print(x + '는 하루에 3번 ' + y + '는 하루에 2번 주세요.')
 
Cat.food('참치','물')

결과: 참치는 하루에 3번 물는 하루에 2번 주세요.

  • 특별한거 없다. 그냥 원하는 메서드 위에 @staticmethod만 써주면 끝!
  • 정적 메서드는 인스턴스를 만들지 않고 class.method()로 바로 불러올 수 있다.
  • 정적 메서드는 self를 받지 않으므로 인스턴스 속성에는 접근할 수 없습니다.
  • 왜 정적 메서드를 쓸까?

    정적 메서드는 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용한다.

              

3. 클래스메서드 (class method)

클래스 메서드. 이것도 메스드의 한 종류겠지. 정적 메서드와는 어떻게 다를까?

class method는 static method처럼 인스턴스 없이 클래스 이름을 써서 호출할수 있다는 점은 같다. BUT! 다른점은 class method는 class 속성, method에 접근을 할 수 있다는 차이점이 있다.

class Cat: 
	
    count = 0 #클래스 속성 
    
    def __init__(self): 
    	Cat.count += 1 
        #인스턴스가 만들어질때마다 count에 1일 더하자. 
        # count 는 클래스 속성. 
    
	@classmethod
    def count_cats (cls):
    	print('총 {} 마리의 고양이 멤버가 있습니다.'.format(cls.count))

podo = Cat() 	#count에 1을 더해줌 
lola = Cat()	#count에 1을 더해줌 
noonoo = Cat()	#count에 1을 더해줌 

Cat.count_cats()

결과: 총 3 마리의 고양이 멤버가 있습니다.

  • __init__ 은 인스턴스를 초기화 해 준다. 여기서는 init 안에서 클래스 속성인 count 변수에 접근한다. Cat클래스의 인스턴스가 생길때 마다 클래스 count 속성에 1씩 더해준다.
  • 클래스 매서드에서 기억해야 하는 세가지 - 1) @classmethod를 위에 써주고, 2) def method의 첫번째 변수에 꼭! cls를 붙여준다. 3) method 안에서 클래스 속성에 접근할 때는 cls.클래스속성 (곧 Cat.count라는 뜻) 이렇게 써준다.

마지막으로 class method로 할 수 있는 놀라운 것. 바로 메서드 안에서 인스턴스를 추가 할 수 있다. 오호!

class Cat: 
    def __init__(self, name):
        self.name = name 
    
    @classmethod
    def naming(cls):
        podo = cls('포도')  #cls() = Cat() podo의 인스턴스화 
        return podo.name

Cat.naming()

결과: '포도'

profile
문과로 한평생 살다가 현재 펜실베니아 주립대 (University of Pennsylvania) 에서 Computer and Information Technology 공부하고 있습니다.

0개의 댓글