함수를 정의하는 것은 함수 객체를 만드는 것이다. 클래스를 정의하는 것도 실제 클래스를 만드는 것이다. 파이썬에서 클래스는 객체를 만드는 툴이다!
클래스를 정의하는 문장
클래스를 만드는 이유는 클래스가 관리하는 영역과 객체를 만들어 사용하는 영역을 구분하기 위해서이다. 클래스나 객체는 자신이 사용하는 속성과 메소드를 가질 수 있다.
클래스를 정의하는 기본적인 규칙은 머리부와 몸체부를 선언하는 것이다.
class Person(object):
pass
객체를 생성할 때는 클래스 이름과 호출 연산자를 사용한다. 객체를 사용하려면 변수에 할당해야 하고 객체가 만들어지면 자신을 생성한 클래스 정보를 __class__ 속성에 보관한다. 이 속성을 조회하면 클래스 정보가 나온다.
현재 출력된 클래스 정보 앞에 __main__이 붙은 것은 현재 작성되는 모듈의 이름이 __main__이라는 뜻이다.
class Person(object):
pass
p = Person()
p.__class__
[결과]
__main__.Person
클래스가 정의되면 __dict__이 만들어진다. 클래스 내부에 정의된 것은 이 이름공간에 저장되고, 아무런 기능이 없어도 아래 4개의 속성은 기본으로 만들어진다.
class Person(object):
pass
Person.__dict__
[결과]
mappingproxy({'__module__': '__main__',
'__dict__': <attribute '__dict__' of 'Person' objects>,
'__weakref__': <attribute '__weakref__' of 'Person' objects>,
'__doc__': None})
객체의 속성과 인스턴트 메소드 추가
파이썬에서 객체의 속성은 객체의 이름공간에서 관리한다. 고로 클래스의 인스턴트 메소드는 클래스 이름공간에서 관리한다.
클래스를 정의할 때에는 객체의 속성을 __init__함수 내부에 정의한다. 인스턴스 메소드로 사용하는 함수를 정의할 때 첫 번째 매개변수는 항상 self를 지정해야 한다. 이는 매개변수 이름이지 예약어는 아니다. 클래스에서 함수를 호출할 때 객체를 넣어 사용할 수도 있기 때문이다.
직접 클래스를 선언해보자.
class Klass(object):
def __init__(self, name):
self.name = name
def getName(self):
return self.name
def setName(self, name):
self.name = name
객체를 만들 때 인자는 __init__함수에 정의된 2개의 매개변수 중 self를 제외한 매개변수와 매핑되도록 한다. 그래서 위 클래스의 객체를 선언하려면 name 문자열을 하나 넣어야 한다. k라는 객체를 만든 후 객체의 속성을 확인하기 위해 __dict__를 조회하면 속성의 이름이 문자열로 들어가 있고 값도 문자열로 들어가 있는 것을 볼 수 있다.
class Klass(object):
def __init__(self, name):
self.name = name
def getName(self):
return self.name
def setName(self, name):
self.name = name
k = Klass("Park")
k.__dict__
[결과]
{'name': 'Park'}
위에서 봤던 것처럼 클래스의 이름공간 __dict__를 조회하면 클래스에 정의된 함수가 3개 늘어난 것을 확인할 수 있다.
객체는 __init__함수에 정의된 속성만 관리하고 나머지는 클래스에서 관리한다!
Klass.__dict__
[결과]
mappingproxy({'__module__': '__main__',
'__init__': <function __main__.Klass.__init__(self, name)>,
'getName': <function __main__.Klass.getName(self)>,
'setName': <function __main__.Klass.setName(self, name)>,
'__dict__': <attribute '__dict__' of 'Klass' objects>,
'__weakref__': <attribute '__weakref__' of 'Klass' objects>,
'__doc__': None})
참고로, 클래스 내부 속성과 객체의 내부 속성은 다르다. 아래의 예시를 참고하자.
class Klass(object):
name = "Lee"
def __init__(self, name):
self.name = name
def getName(self):
return self.name
def setName(self, name):
self.name = name
k = Klass("Park")
print(k.name)
print(Klass.name)
[결과]
Park
Lee
객체도 호출 연산자를 통해 호출할 수 있다!
호출할 수 있는 경우에는 항상 클래스 내부에 객체를 호출할 수 있는 스페셜 메소드 __call__이 구현되어 있다.
자세한 사항은 아래 링크를 참고하면 좋을 것 같다.
참고
- 한권으로 개발자가 원하던 파이썬 심화 A to Z, 문용준/문성혁 저
'◎ Python > 파이썬 심화 (책)' 카테고리의 다른 글
[파이썬 심화] 15. 특별한 내장 클래스 (0) | 2022.09.13 |
---|---|
[파이썬 심화] 14. 클래스와 객체 구조를 알아보자 (0) | 2022.09.07 |
[파이썬 심화] 12. 함수에 여러 가지 종류의 매개변수를 설정할 수 있다! (1) | 2022.09.05 |
[파이썬 심화] 11. 함수 정의하기 (0) | 2022.09.02 |
[파이썬 심화] 10. 여러 조건에 따라 기능 선택하기 (0) | 2022.09.01 |
자기계발 블로그