오늘은 class 안에 사용되는 속성(attribute) 과 메서드 (method)에 대해서 좀 더 살펴보려 한다.
속성에는 두가지 종류가 있다 - 클래스, 인스턴스.
클래스 기초에서 사용했던 코드를 가져와서 cat_attribute 라는 속성을 추가해 줬다.
class Cat:
cat_attributes = ['귀여움','도도함','독립적임']
podo = Cat()
lola = Cat()
cat_attribute는 클래스 속성이다. 클래서 안에서 정의되어 있는 속성. 이 속성은 다양한 방법으로 호출될수 있다.
모두 결과값은 ['귀여움','도도함','독립적임']
그럼 인스턴스 속성은 무엇일까? 왜 두개를 구분해 줄까?
인스턴스 속성은 각 인스턴스를 위한 속성을 따로 만들어 주고 싶을때 사용한다. 예를들어 모든 고양이의 특징이 아니고 각 고양이들의 특징을 얘기하고 싶을때.
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라는 속성에 저장하고 불러왔다.
정적메서드. 메서드 중에서 특정한 기능을 가지고 있는 method 라고 추측해 볼 수 있다.
class Cat:
@staticmethod ---> 중요함!
def food(x,y):
print(x + '는 하루에 3번 ' + y + '는 하루에 2번 주세요.')
Cat.food('참치','물')
결과: 참치는 하루에 3번 물는 하루에 2번 주세요.
정적 메서드는 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용한다.
클래스 메서드. 이것도 메스드의 한 종류겠지. 정적 메서드와는 어떻게 다를까?
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 마리의 고양이 멤버가 있습니다.
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()
결과: '포도'