본문 바로가기
Programming/Python

[python]보안프로그래밍3 기말고사 정리(5)

by graygreat 2017. 6. 14.
728x90
반응형


클래스 메소드


● 인스턴스 객체와 무관하게 클래스 이름 공간에 존재하는 메소드로서 클래스 이름을 이용하여 호출하며 첫 인수로 클래스 객체를 자동으로 받는 메소드


● 장식자 @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에 들어감


반응형

댓글