본문 바로가기

프로그래머/Python

[윤성우의 열혈 파이썬 중급편] 23. 클래스와 객체의 본질

출처 : 윤성우의 열혈 파이썬 : 중급

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이라는 클래스의 객체이다
  • 메타 클래스