class 클래스 이름: #헤더(Header)
pass #몸체(Body)
class S1:
a = 1
print(S1.a)
print()
S1.b = 2 # 클래스 이름 공간에 새로운 이름의 생성
print(S1.b)
print()
print(dir(S1)) # S1에 포함된 이름들을 리스트로 반환
del S1.b # 이름 공간 S1에서 b삭제
print(dir(S1))
1 2 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b'] ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a']
x = S1() # x는 S1의 클래스 인스턴스
print(x.a)
x.a = 10 # 클래스 인스턴스 x의 이름 공간에 이름 생성
print(x.a)
print(S1.a) # 클래스 이름 공간과 클래스 인스턴스의 이름공간은 다르다
1 10 1
y = S1() # S1 클래스의 또 다른 인스턴스 생성
y.a = 300 # 클래스 인스턴스 y의 이름 공간에 이름 생성
print(y.a)
print(x.a) # x 인스턴스 공간의 이름 a 확인
print(S1.a) # 클래스 이름 공간의 a 확인
300 10 1
class Simple:
pass
s1 = Simple()
s2 = Simple()
s1.stack = [] # 동적으로 클래스 인스턴스 이름 공간 안에 새로운 변수(이름) stack 생성
s1.stack.append(1) # 값 추가
s1.stack.append(2)
s1.stack.append(3)
print(s1.stack)
print(s1.stack.pop())
print(s1.stack.pop())
print()
print(s1.stack) # 최종 s1.stack값
print(s2.stack) # s2에는 stack을 정의한 적이 없다.
#기존에러:
#AttributeError: Simple instance has no attribute 'stack'
[1, 2, 3] 3 2 [1]
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-5-16ef97da3337> in <module>() 9 print() 10 print(s1.stack) # 최종 s1.stack값 ---> 11 print(s2.stack) # s2에는 stack을 정의한 적이 없다. 12 13 #기존에러: AttributeError: 'Simple' object has no attribute 'stack'
del s1.stack # s1에서 stack삭제
def
키워드 사용self
사용 (self
라는 이름은 관례적)self
: 인스턴스 객체 자신의 레퍼런스를 지니고 있음self
를 이용하여 자신의 이름 공간에 접근class MyClass:
def set(self, v):
self.value = v
def get(self):
return self.value
self
인자는 없다고 생각c = MyClass() # 인스턴스 생성
c.set('egg') # 메소드 set 호출
print(c.get()) # 메소드 get 호출
print(c.value) # 인스턴스 변수에 직접 접근
egg egg
c = MyClass() # 인스턴스 생성
MyClass.set(c, 'egg')
print(MyClass.get(c))
print(c.value)
egg egg
class MyClass:
def set(self, v):
self.value = v
def incr(self):
self.set(self.value + 1) # 내부 메소드 호출
def get(self):
return self.value
c = MyClass()
c.set(1)
print(c.get())
print()
c.incr()
print(c.get())
1 2
self.set(self.value + 1)
를 set(self.value + 1)
으로 바꾸면 set
함수를 클래스 외부에서 찾는다.def set(i):
print("set function outside function - ", i)
class MyClass:
def set(self, v):
self.value = v
def incr(self):
set(self.value + 1) # 클래스 외부에 존재하는 set 메소드 호출
def get(self):
return self.value
c = MyClass()
c.set(1)
print(c.get())
print()
c.incr()
print(c.get())
1 set function outside function - 2 1
정적 메소드: 인스턴스 객체와 무관하게 클래스 이름 공간에 존재하는 메소드로서 클래스 이름을 이용하여 직접 호출할 수 있는 메소드
장식자(Decorator) @staticmethod
활용
class D:
@staticmethod
def spam(x, y): # self가 없다.
print('static method', x, y)
D.spam(1, 2) # 인스턴스 객체 없이 클래스에서 직접 호출
print()
d = D()
d.spam(1, 2) # 인스턴스 객체를 통해서도 호출 가능
static method 1 2 static method 1 2
장식자(Decorator) @classmethod
활용class C:
@classmethod
def spam(cls, y):
print(cls, '->', y)
print(C)
C.spam(5) # 첫번째 인수로 C가 잠재적으로 전달된다.
c = C()
c.spam(5) # 인스턴스 객체를 통해서도 호출 가능.
<class '__main__.C'> <class '__main__.C'> -> 5 <class '__main__.C'> -> 5
class D(C):
pass
print(D.spam(3))
print()
d = D()
print(d.spam(3))
print()
print(C.spam(3))
<class '__main__.D'> -> 3 None <class '__main__.D'> -> 3 None <class '__main__.C'> -> 3 None
class Var:
c_mem = 100 # 클래스 멤버 정의
def f(self):
self.i_mem = 200 # 인스턴스 멤버 정의
def g(self):
print(self.i_mem)
print(self.c_mem)
print(Var.c_mem) # 클래스 객체를 통하여 클래스 멤버 접근
v1 = Var() # 인스턴스 v1 생성
print(v1.c_mem) # 인스턴스를 통하여 클래스 멤버 접근
v1.f() # 인스턴스 멤버 i_mem이 생성됨
print(v1.i_mem) # 인스턴스 v1을 통하여 인스턴스 멤버 접근
print("-------")
v2 = Var() # 인스턴스 v2 생성
print(v2.c_mem)
print(v2.i_mem) # 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성
100 100 200 ------- 100
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-7-7de78758c39d> in <module> 9 v2 = Var() # 인스턴스 v2 생성 10 print(v2.c_mem) ---> 11 print(v2.i_mem) # 인스턴스 v2에는 아직 f() 호출이 안되어서 i_mem 멤버 없음 ==> 생성자의 필요성 AttributeError: 'Var' object has no attribute 'i_mem'
print(v1.c_mem) # 인스턴스 v1을 통해 클래스 멤버 참조
print(v2.c_mem) # 인스턴스 v2를 통해 클래스 멤버 참조
print()
v1.c_mem = 50 # 인스턴스 이름 공간에 c_mem생성
print(v1.c_mem) # 인스턴스 v1을 통해 인스턴스 멤버 참조
print(v2.c_mem) # 인스턴스 v2을 통해 클래스 멤버참조 (인스턴스 멤버가 없으므로, 클래스 멤버 참조)
print(Var.c_mem) # 클래스 멤버참조
100 100 50 100 100
__init__: 생성자 메소드
self
인자가 정의되어야 함__del__: 소멸자 메소드
self
인자가 정의되어야 함[참고] __ (연속된 두 개의 언더라인)의 의미: 예약된 (특수) 이름
mylife = Life()
로서 로컬 변수에 할당되는 인스턴스 mylife
가 생성되는 순간 __init__ 생성자 메소드 호출sleep(3)
에 의해 3초간 sleep 상태# _*_ coding:utf-8 _*_
from time import ctime, sleep
class Life:
def __init__(self): # 생성자
self.birth = ctime() # 현재시간에 대한 문자열을 얻는다.
print('Birthday', self.birth) # 현재 시간 출력
def __del__(self): # 소멸자
print('Deathday', ctime()) # 소멸 시간 출력
def test():
mylife = Life()
print('Sleeping for 3 sec')
sleep(3) #3초간 sleep(block)상태에 있음 (즉, 3초간 CPU 점유 못함)
test()
Birthday Wed Nov 28 22:30:18 2018 Sleeping for 3 sec Deathday Wed Nov 28 22:30:21 2018
print
예약어나 str()
내장함수 호출에 대응되는 메소드class Integer:
def __init__(self, i):
self.i = i
def __str__(self):
return "self.i:" + str(self.i)
i = Integer(10)
print(i)
print(str(i))
self.i:10 self.i:10
참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일