클래스 메소드
● 인스턴스 객체와 무관하게 클래스 이름 공간에 존재하는 메소드로서 클래스 이름을 이용하여 호출하며 첫 인수로 클래스 객체를 자동으로 받는 메소드
● 장식자 @classmethod 사용
● 상속받은 서브 클래스를 통해 호출하면, 첫 인수에는 서브 클래스 객체가 자동으로 할당됨
class C: @classmethod def spam(cls, y): print cls,'->', y class D(C): pass d = D() print d.spam(3)
// 결과값
__main__.D -> 3
None
__main__.D -> 3
None
★ None이 나오는 이유?
파이썬은 함수에 return문이 없다 할지라도 실제로 None 객체가 전달이 된다. None객체는 파이썬 내장 객체로서 아무 값도 없음을 나타내기 위한 객체이다. print d.spam(3)이 실행되면 먼저 spam함수안에 있는 print가 실행된다. spam 함수는 return문이 없기 때문에 None 객체를 가지게 되고, print를 만나 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.i_mem # 인스턴스 v2에는 아직 f()호출이 안되어서 i_mem 멤버 없음
// 결과값
error
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 생성 v2.f() print v2.i_mem
// 결과값
100
100
200
200
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 생성 v2.f() print v2.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
200
200
100
100
50
100
100
비교 연산자 중복
● c.__cmp__() 호출 결과가 양수이면 True 반환, 아니면 False 반환
class MyCmp: def __cmp__(self, y): return 1 - y c = MyCmp() print c > 1 print c < 1 print c == 1
// 결과값
False
False
True
● 1이 __cmp__(self, y)에서 y에 들어감
'Programming > Python' 카테고리의 다른 글
[python] 보안프로그래밍3 기말고사 정리(4) (0) | 2017.06.14 |
---|---|
[python] 보안프로그래밍3 기말고사 정리(3) (0) | 2017.06.14 |
[python] 보안프로그래밍3 기말고사 정리(2) (0) | 2017.06.14 |
[python] 보안프로그래밍3 기말고사 정리(1) (0) | 2017.06.13 |
[python] 보안프로그래밍3 중간고사 정리 (5) (2) | 2017.04.25 |
댓글