출처 : 윤성우의 열혈 파이썬 : 중급
23. 클래스와 객체의 본질
객체 안에 변수가 만들어지는 시점
class Simple:
def seti(self, i):
self.i = i
def geti(self):
return self.i
s1 = Simple()
s1.seti(200) # 이 때 객체 내에 변수 i 생성
s1.geti() # 200
s2 = Simple()
s2.geti() # error
- 클래스의 기본 정의 : 클래스 내에 들어갈 변수와(데이터와) 메소드를(기능을) 결정하는 것
- 위의 클래스에는 메소드의 정의만 존재. 즉, 변수의 선언은 존재하지 않는다
- 파이썬은 객체에 필요한 변수를 알아서 생성해준다
- 객체 내에 변수가 생성되는 정확한 시점은 객체 내에서 새당 변수를 대상으로 대입 연산을 처음 진행하는 순간이다
class Simple:
def __init__(self):
self.i = 0
def seti(self, i):
self.i = i
def geti(self):
return self.i
s = Simple()
s.geti() # 0
s.seti(25)
s.geti() # 25
- 객체 생성 시 자동으로 호출되는 __ init __메소드
- 그 안에서 객체 내에 필요한 모든 변수 초기화
- __ init __의 호출이 완료되는 시점을 객체 생성이 완료되는 시점으로 판단한다
객체에 변수와 메소드 붙였다 떼었다 해보기
class Sosimple:
def geti(self):
return self.i
ss = SoSimple()
ss.i = 27 # 이 순간 변수 ss에 담긴 객체에 i라는 변수가 생긴다
ss.geti() # 27
- 객체 생성 이후에 변수 i를 객체에 추가
ss.hello = lambda : print('hi~')
ss.hello()
del ss.i # ss에 담긴 객체에서 변수 i 삭제
del ss.hello # ss에 담긴 객체에서 메소드 hello 삭제
ss.geti() # error
클래스에 변수 추가하기
class Simple:
def __init__(self, i):
self.i = i
def geti(self):
return self.i
Simple.n = 7
Simple.n # 7
- 파이썬에는 클래스에도 변수를 추가할 수 있다
- 파이썬의 클래스는 클래스이자 객체이다
- 프로그래머가 직접 정의하는 클래스들은 'type이라는 클래스'의 객체이다
- 객체에 변수를 추가하듯이 클래스에도 변수를 추가할 수 있다
s1 = Simple(3)
s2 = Simple(5)
print(s1.n, s1.geti(), spe = ', ')
print(s2.n, s2.geti(), spe = ', ')
- s1과 s2의 객체에는 n이 없다
- 파이썬은 해당 객체의 설계도에 해당하는 클래스를 찾아가서 n을 찾는다
클래스에 속하는 변수를 만들 수 있다
객체에 찾는 변수가 없으면 해당 객체의 클래스로 찾아가서 그 변수를 찾는다
파이썬에서는 클래스도 객체
type # <class 'type'>
type([1,2]) # <class 'list'>
type(list) # <class 'type'>
class Simple:
pass
type(Simple) # <class 'type'>
simple2 = Simple # 변수 simple2에 클래스 Simple 담음
s1 = Simple() # 클래스 Simple로 객체 생성
s2 = Simple2() # 변수 simple2로도 객체 생성할 수 있음
- 클래스도 객체이다
- 클래스는 type이라는 클래스의 객체이다
- 메타 클래스
'프로그래머 > Python' 카테고리의 다른 글
[윤성우의 열혈 파이썬 중급편] 25. isintance 함수와 object 클래스 (0) | 2020.12.24 |
---|---|
[윤성우의 열혈 파이썬 중급편] 24. 상속 (0) | 2020.12.24 |
[윤성우의 열혈 파이썬 중급편] 22. 메소드 기반 문자열 조합 (0) | 2020.12.24 |
[윤성우의 열혈 파이썬 중급편] 21. 표현식 기반 문자열 조합 (0) | 2020.12.24 |
[윤성우의 열혈 파이썬 중급편] 20. enumerate와 문자열 비교 (0) | 2020.12.24 |