정적 메쏘드

정적 메쏘드(static method)란, 인스턴스 객체를 생성하지 않고도, 혹은 인스턴스 객체를 이용 하지 않고도 클래스 이름을 이용하여 직접 호출할 수 있는 메쏘드이다.

C++, Java의 정적 메쏘드와 동일한 개념이다.


정적 메소드는 일반 메소드와는 달리 첫 인수로 self를 받지 않는다. 필요한 만큼의 인수를 선언하면 된다.

staticmethod로 등록하면 정적 메소드가 된다.



클래스 메소드

일반 메소드가 첫 인수(self)로 인스턴스 객체를 받는 것에 비해서, 클래스 메소드는 첫 인수로 "클래스 객체'를 받는다. 

메소드를 클래스 메소드로 변환하기 위해서 classmethod() 를 호출해야 한다. 

클래스 메소드 호출시 첫 번째 인수로 자동으로 해당 클래스 객체가 전달된다.

C가 첫 번째 인수로 잠재적으로 전달된다.

- 상속받은 클래스인 경우, 첫 번째 인수는 클래스 메쏘드를 호출한 클래스가 된다.



장식자

앞서 설명한 정적 메소드와 클래스 메소드는 메소드 선언 시에 그  유형이 분명히 드러나지 않는 단점이 있다. 

@staticmethod나 @classmethod 를 장식자(Decorator)라 하는데, 함수나 메소드 정의 앞 줄에 와야 한다.


장식자는 순차적으로 나타탈 수도 있다.

@A @B @C

def f():

...

혹은 여러 줄에 걸쳐 쓸 수도 있다.

@A

@B

@C

def f():

...

위의 코드는 다음 코드와 동일하다.

def f():

...

f = A(B(C(f)))




장식자가 인수를 가질 수도 있다.

@A @B @C(args)

def f():

...

이것은 다음 코드와 동일하다.

def f():

...

f = A(B(C(args)(f)))


즉, C(args)는 새로운 장식자를 리턴하며, 그 장식자의 인수로 f가 전달된다.





인수의 형 검사를 하는 decorator의 실제적인 예는 다음과 같다.


결과


'Programming > Python' 카테고리의 다른 글

생성자와 소멸자  (0) 2013.05.02
class member, instance member  (0) 2013.05.02
메쏘드의 정의와 호출  (0) 2013.05.01
class  (0) 2013.05.01
문자열 이름으로 속성 값 참조  (0) 2013.05.01
Posted by scii
:


self 는 C++나 JAVA의 this와 유사한 기능을 한다. 즉, 자신의 인스턴스 객체를 가리키는 레퍼런스이다. 

모든 메쏘드는 반드시 이 self를 첫 인수로 받아야 한다. 이 self를 이용하여 클래스 인스턴스의 이름 공간에 접근해야 하기 때문이다.


c = myclass()

c.set('asdf')

c.put()

위의 코드는 아래의 코드와 동일하다.

myclass.set(c, 'asdf')

myclass.put(c)


self는 실제로 인스턴스 c의 레퍼런스로 자동적으로 대치된다.


이와 같이 클래스 객체를 이용하여 메쏘드를 호출하는 것을 "Unbaound Class Method" 호출 이라고 한다. 

인스턴스를 통하여 자동으로 self인수를 전달하는 방식을 "Bound Instance Method" 호출이라고 한다.



클래스 내부에서의 메쏘드 호출

클래스 내부에서 내부의 메쏘드를 호출할 때는 멤버를 참조하는 것과 같은 방식으로 self를 이용해야 한다.


만일 self를 이용하지 않고 그냥 method만 호출했다면.....

클래스 내에서가 아니라, 클래스 외부, 즉, 모듈에서 이 함수를 찾는다. 

클래스의 멤버나 메쏘드를 참조하려면 언제나 self를 이용하는 것을 잊지 말아야 한다.



'Programming > Python' 카테고리의 다른 글

class member, instance member  (0) 2013.05.02
정적 메소드, 클래스 메소드, 장식자  (0) 2013.05.01
class  (0) 2013.05.01
문자열 이름으로 속성 값 참조  (0) 2013.05.01
모듈의 실행 ( __name__ == '__main__' )  (0) 2013.05.01
Posted by scii
:

class

Programming/Python 2013. 5. 1. 20:41 |


파이썬의 클래스는 새로운 이름 공간을 지원하는 단위이다. 이 이름 공간에는 함수와 변수가 포함될 수 있다. 

모듈과 차이가 있다면, 모듈 파일 단위로 이름 공간을 구성하는 반면, 

클래스는 클래스 영역과 인스턴스 영역 내에 이름 공간을 구성한다. 상속 관계에서 상위클래스는 하위 클래스의 이름 공간에 포함된다.


클래스와 이름 공간

클래스 인스턴스도 이름 공간을 생성한다. 이것은 모듈에 없는 중요한 기능이다. 

클래스는 하나 이상의 인스턴스 객체를 생성하는 틀과 같다.


상속

모듈과의 중요한 차이점은, 클래스는 상속(Inheritance)이 된다는 것이다.

클래스는 다른 클래스와 공통적인 특징을 공유할 수 있으므로, 개별적인 특징만을 새로 정의하는 새로운 클래스를 만들 수 있다. 

즉, 재사용성이 있다.


연산자 중복

파이썬 클래스는 연산자 중복을 지원한다. 각종 산술, 논리, 슬라이싱, 인덱싱 등등의 연산을 중복할 수 있다.

연산자 중복이란, 어떤 연산자를 클래스 객체에서도 사용할 수 있게, 거기에 맞는 함수를 정의하는 것이다.



파이썬에서 클래스에 관련된 꼭 필요한 용어

 class  class 문으로 정의되며, 멤버와 메쏘드를 가지는 객체이다.
 class object

 클래스와 같은 의미로 사용. 클래스를 종종 특정한 대상을 가리키지 않고 일반적을 언급하기 위해서 사용하는 반면에, 클래스 객체는 어떤 클래스를 구체적으로 지정하기 위해서 사용하기도 한다. 

 class instance 

 클래스를 호출하여 만들어지는 객체 

 class instance object  

 클래스 인스턴스와 같은 의미이다. 인스턴스 객체라고 부르기도 한다. 

 member 

 클래스가 갖는 변수 

 method 

 클래스 내의 정의된 함수 

 attribute 

 멤버와 메쏘드 전체를 가리킨다. 즉, 이름 공간의 이름 전체를 의미한다. 

 super class 

 base class 라고 하기도 한다. 어떤 클래스의 상위에 있으며 각종 속성을 서브 클래스로 상속해 준다. 

 sub class 

 derived class 라고 하기도 한다. 슈퍼 클래스로부터 상속된 하위의 클래스를 말한다. 슈퍼 클래스로부터 각종 속성을 상속받으므로 코드와 변수를 공유한다. 



객체지향 프로그래밍에서 클래스들이 가지는 중요한 특성

 inheritance

 기존의 클래스의 속성과 행동을 그대로 받아들이고 추가적으로 필요한 기능을 새로운 클래스에 덧붙이는 것이다. 소프트웨어의 재사용 관점에서 상속은 대단히 중요한 역할을 하며, 프로그램의 개발 시간을 단축시켜 준다. 

 다른 프로그래밍 기법과 객체지향 프로그래밍을 구분하는 중요한 특징이다. A클래스를 슈퍼 클래스로 하는 클래스 B를 생성하였다면 "B is-a A" 관계라고 한다. 

 multiple inheritance 

 두 개 이상의 슈퍼 클래스로부터 상속받는 것. 

 polymorphism 

 상속 관계 내의 다른 클래스의 인스턴스들이 같은 멤버 함수 호출에 대해 각각 다르게 반응하도록 하는 기능. 

 encapsulation 

 메쏘드와 멤버를 클래스 내에 포함시키고 외부에서 접근 가능하도록 인터페이스만을 공개하고 다른 속성들을 내부에 숨기는 것. 

 composition 

 x라는 객체(혹은 다수의 객체)가 클래스 A안에 포함되어 A의 각종 메쏘드를 구현하는데 사용된다. 

 즉, 어떤 객체가 다른 객체에 포함되어 활용되는 것을 말한다. 이때 A가 x를 포함하므로 "has-a" 관계라고 한다. 



'Programming > Python' 카테고리의 다른 글

정적 메소드, 클래스 메소드, 장식자  (0) 2013.05.01
메쏘드의 정의와 호출  (0) 2013.05.01
문자열 이름으로 속성 값 참조  (0) 2013.05.01
모듈의 실행 ( __name__ == '__main__' )  (0) 2013.05.01
Module  (0) 2013.05.01
Posted by scii
:


getattr(), setattr(), hasattr(), delattr()

만일 어떤 변수에 참조하기를 원하는 속성 이름이 문자열로 주어져 있다면 getattr 내장 함수를 이용하여 참조할 수 있다. 

getattr 함수
getattr(object, name) 형식으로 어떤 객체에서 문자열로 주어진 이름에 해당하는 속성을 리턴한다. 만일 이름이 없으면 AttributeError 예외를 발생시킨다.

당연히 함수를 호출할 수도 있다. 세가지 방법이 있다.



getattr(object, name)                     -> object에서 문자열로 주어진 name 속성을 얻어 낸다.

setattr(object, name, value)         -> object에서 문자열로 주어진 name 속성으로 value를 설정한다.

hasattr(object, name)                     -> object에서 문자열로 주어진 name 속성을 가지고 있는지 묻는다. 있다면 True

delattr(object, name)                     -> object에서 문자열로 주어진 name 속성을 없앤다.


이들 네 개의 함수는 모듈뿐 아니라 클래스, 클래스 인스턴스 객체에도 그대로 적용 가능하다.



'Programming > Python' 카테고리의 다른 글

메쏘드의 정의와 호출  (0) 2013.05.01
class  (0) 2013.05.01
모듈의 실행 ( __name__ == '__main__' )  (0) 2013.05.01
Module  (0) 2013.05.01
열혈강의 파이썬 10장 연습문제 풀이  (0) 2013.04.30
Posted by scii
:


파이썬은 지금 모듈이 가장 먼저 수행되는 최상위 모듈인지, 아니면 다른 모듈에 의해 임포트 되는 모듈인지를 구별하기 위하여 __name__ 이라는 특별한 내장 이름을 가지고 있다.

__name__ 은 일반적으로는 자시의 모듈 이름을 가진다. 

ex) fie: test.py

print __name__ 

이런 파일이 있다고 한다면...


이 파일을 대화식 인터프리터에서 수행하면, 자기 모듈 이름을 출력한다. 즉, test를 출력한다.

그러나 test.py 가 프로그램 모드로 수행되면 __name__ 은 '__main__' 이란 이름을 가진다.


가장 먼저 파이썬 인터프리터에 의해 사용되는 모듈이 __main__ 이란 이름을 가진다는 것을 이용하면, 특정 코드를 선택적으로 실행하게 만들 수 있다.

def test():

print "hahaha"


if __name__ == "__main__":

test()


위 코드에서 if 문 안의 test() 는 가장 먼저 수행되는 최상위 모듈일 때만 수행되고,

다른 모듈에 의해 import될 때는 수행되지 않는다.


따라서, 모든 파이썬 모듈은 독립적으로 수행될 수 있으며, 또한 다른 모듈에 의해 호출될 수도 있다. 이것은 파이썬 모듈을 독립적으로 만들어 주는 좋은 특징 중에 하나이다.

보통 파이썬 모듈 파일을 만들 때에는 마지막 부분에 위와 같은 방식으로 테스트 코드를 추가하여 충분히 테스트하며, 테스트가 끝나면 코드의 수정 없이 다른 모듈에서 바로 임포트해서 이용한다.

'Programming > Python' 카테고리의 다른 글

class  (0) 2013.05.01
문자열 이름으로 속성 값 참조  (0) 2013.05.01
Module  (0) 2013.05.01
열혈강의 파이썬 10장 연습문제 풀이  (0) 2013.04.30
함수 객체의 속성  (0) 2013.04.28
Posted by scii
:

Module

Programming/Python 2013. 5. 1. 02:26 |


모듈이란, 파이썬 프로그램 파일 혹은 C 확장 파일로 프로그램과 데이터를 정의하고 있으며, 고객(client,  어떤 모듈을 호출하는 측)이 모듈에 정의된 함수나 변수의 이름을 사용하도록 허용하는것으로 정의한다.

모듈은 코드들을 묶어 재사용 가능하게 만드는 하나의 단위이다.

모듈은 서로 연관된 작업을 하는 코드들의 모임으로 구성된다. 작성 중인 모듈의 크기가 어느 정도 커지게 되면 일반적으로 관리 가능한 작은 단위로 다시 분할된다.

지나치게 큰 모듈은 개념적으로나 실행 효율면에서 좋지 않다.

이렇게 분리된 모듈은 코드의 독립성을 유지하여 나중에 재사용할 수 있도록 만드는 것이 좋다.


표준 모듈파이선 언어 패키지 안에 포함된 모듈

사용자 생성 모듈사용자가 직접 만든 모듈

써드 파티 모듈다른 업체나 개인이 만들어서 제공하는 모듈



모듈을 왜 사용하는가?

1) 코드를 재사용할 수 있다.

2) 모듈은 시스템 구성 요소의 기본 단위이다. 하나의 시스템을 모듈 단위로 분리해서 설계하는 것은 여러 면에서 작업의 효율을 높일 수 있다.

3) 모듈은 별도의 이름공간을 제공한다.

이름 공간이란? 이름(변수)이 저장되는 공간을 의미 (함수도, 클래스의 객체도 별도의 이름 공간이다.)


※ 앞 뒤에 두 개의 '_'이 붙은 이름들은 시스템에서 사용하고 있는 이름들이다.



모듈의 검색 경로

파이썬은 가장 먼저 현재 디렉토리를 찾고, 없으면 환경 변수 PYTHONPATH에 기술된 디렉토리의 목록을 검색한다.

ex) csh의 경우 : setenv PYTHONPATH ~/Desktop

ex) bash의 경우 : export PYTHONPATH=~/Desktop


모듈의 검색 경로 동적으로 바꾸기

프로그램 내에서 동적으로 검색 경로를 바꾸려면 sys 표준 모듈의 path 리스트를 이용한다.

sys.path는 파이썬이 검색하는 디렉토리의 모든 경로가 들어 있다.

ex) sys.path.append('~/Desktop')



import 에 대하여

1) import 모듈명

이 방법은 모듈의 네임 스페이스를 그대로 유지하므로 모듈 내의 이름을 부를 때는 '모듈 이름.이름' 형식을 이용한다.

ex) A.B.C는 객체 A에서 B를 찾고, 객체 A.B에서 C를 찾는다.


2) from 모듈명 import 이름(들)

이 방법은 모듈 내의 특정한 이름들을 현재의 네임 스페이스로 불러들인다. 따라서 이들 이름은 직접 참조가 가능하다.

만약, 기존에 모듈에서 불러온 이름과 동일한 변수가 있었다면 그 값은 상실된다.


3) from 모듈명 import *

모듈 안에 있는 '_'로 시작하는 이름을 제외한 모든 이름들을 현재의 이름 공간 안으로 불러들인다.


4) import 모듈명 as 새 이름

이 방법은 모듈 이름을 다른 이름으로 사용하고자 할 때 사용한다. 모듈 이름이 너무 길거나, 혹은 사용 중인 이름과 충돌이 일어날 때 유용하게 사용될 수 있다.


5) from 모듈명 import 이름 as 새 이름

이 방법은 모듈 내에서 정의된 이름을 다른 이름으로 사용하고자 할 때 사용한다.


6) from 모듈명 import (이름들..)

하나의 모듈에서 다수의 이름을 import할 때 다음과 같이 괄호를 사용할 수 있다.

ex) from string import (atoi, atol, upper)


※ import와 from은 실행 가능한 문이다. 따라서 보통의 문이 나올 수 있는 곳이면 어디에서나 사용 가능하다.

※ import와 from은 치환문이다. 즉, import mymath는 현재의 네임 스페이스에 mymath란 이름을 생성하고 이름 mymath는 모듈 객체를 참조한다.


import는 코드를 수행한다.  

import 했을 때, 모듈 안의 문들이 순차적으로 수행된다.



컴파일과 적재 시간

import 문은 *.pyc 파일을 먼저 찾는다. 

*.pyc 파일은 *.py 를 컴파일한 바이트 코드 파일이며, 바이트 코드 생성은 import 할 때(필요하다면) 자동적으로 수행된다.


※ byte code 란?

하나의 중간 언어, 즉, 사람이 보는 파이썬 언어와 기계가 수행하는 기계어의 중간 위치에 있는 언어이다. 이 중간 언어의 역할은 실행 파일을 기계나 플랫폼에 의존하지 않도록 만드는 일이다.

파이썬은 묵시적으로 필요하다면 자동적으로 컴파일되므로 컴파일 언어이면서 동시에 인터프리터 언어의 수행 방식을 취하고 있다. 이 때문에 얻어지는 편리함은 상당히 크다.


바이트 코드 생성이 필요한지의 판단은 파일 생성 시간을 기준으로 한다.

즉, a.py의 생성 시간이 a.pyc의 생성 시간보다 더 최근이라면 새로 컴파일을 한다.


*.pyc 파일은 이식 가능하여 다른 플랫폼 환경에서 수행 가능하다. 또한 소스.py 파일이 없어도 .pyc파일을 먼저 찾아 수행하므로, 코드를 숨기는 간단한 기법으로 활용 가능하다.


※ decompyle - 바이트 코드에서 소스 코드로 변환

바이트 코드가 있다면 소스 코드로 변환하는 것은 어렵지 않다. 이런 일을 해주는 툴이 http://www.goebel-consult.de/decompyle/ 에 공개되어 있다.

사용법은 간단하다.  a.pyc를 소스 코드로 변환하려면 다음과 같이 한다. 변환 결과는 화면에 표시된다.

ex) ./decompyle a.pyc     or     python decompyle a.pyc



문자열로 표현된 모듈 가져오기

모듈 이름이 문자열로 표현되어 있을 때, 그 이름의 모듈을 임포트하는 방법은, __import__ 함수를 사용하는 것이다.

aa = 're'

re = __import__(aa)


※ 한번 import 되는 module은 메모리에 적재되어 있다가 다른 module 에서 import 할 때도 같이 공유된다.



모듈의 재적재

모듈은 처음의 import에 대해서만 실행하고 적재한다. 이미 적재되어 있는 모듈의 import에 대해서는 기존의 잭재되어 있는 모듈을 그냥 이용한다.

파이썬을 이렇게 만든 이유는 재귀적인 import의 가능성 때문이다. 

ex) A.py

import B

ex) B.py

import A


import를 반복한다면 두 모듈은 무한 루프를 돌 것이다. 그래서 일단 메모리에 적재된 모듈은 다시 물리적인 임포트를 하지 않고 이용한다.

만일 모듈을 다시 적재하고 싶다면 "reload" 함수를 이용하면 된다

ex) reload(module)


모듈을 편집기를 이용하여 수정하고, 또 다른 화면에서는 그 모듈을 테스트할 때, reload를 이용하면 파이썬을 빠져 나가서 다시 import하지 않더라도 변경된 내용을 사용할 수 있어 편리하다.


※ 모듈의 재적재

모듈 reload는 해당 모듈만 재적재한다. 예를 들어 모듈 X가 Y를 임포트할 때, reload(X)는 모듈 X만을 재적재하며, Y를 재적재하지는 않는다.



Posted by scii
:


한번 풀어 본 연습문제


python_chapter_10.py


"""

# Q1) range 함수와 유사한 frange 함수를 만들어라. frange는 실수 리스트를 리턴한다.

# frange의 기본 시작 값은 0.0이고, 기본 단계 값은 0.25 이다.

# frange(5.0), frange(1.0, 5.0), frange(1.0, 3.0, 0.1) 등이 동작하도록 하라.


def frange(val, basic=0.0, step=0.25):

    l=[]


    if val < basic:

        start=val

        stop=basic

    else:

        start=basic

        stop=val


    while start < stop:

        l.append(start)

        start+=step

    return l


if __name__=='__main__':

    print frange(2)

    print frange(1.0, 2.0)

    print frange(1.0, 3.0, 0.5)

"""



"""

# Q2) 조합 논리 회로 1비틑 덧셈기 adder를 시뮬레이션 하고자 한다. adder는 두 개의

# 0 또는 1의 값을 가지는 인수를 받고 두 개의 값을 리턴한다. 리턴 값은 덧셈 결과를

# 두 자리로 한 결과이다. adder(0,0) 의 결과는 (0,0)이고 adder(1,1)은 (1,0)이다. 

# adder(0,1)이나 adder(1,0)은 (0,1)의 결과를 낳는다. 이 adder 함수를 작성하라. 


def adder(n1, n2):

    if (not n1) and (not n2):

        return (0,0)


    elif n1 and n2:

        return (1,0)


    else:

        return (0,1)


if __name__=='__main__':

    print adder(0,0)

    print adder(1,1)

    print adder(1,0)

    print adder(0,1)

"""



"""

# Q3) 함수 sum을 정의하라. 이 함수는 임의의 개수의 인수를 받아서 그 합을 계산한다.

# 예를 들면 sum()은 0을, sum(1,2)은 3을 sum(1,5,7,2,3)은 18을 리턴한다. (가변 인수)


def sum(*args):

    return reduce(lambda x, y: x+y, args, 0)


if __name__=='__main__':

    print sum(*range(0,101))

"""


"""

# Q4)이미지 파일을 작게 표시하기 위한 썸네일이라는 작은 이미지 파일들이 있다.

#        이 파일들은 원래의 이미지 파일에 _thumb란 이름이 추가로 붙는다.

#        예를 들면 a.jpg의 썸네일 파일은 a_thumb.jpg 이다.

#        이미지 파일 이름들이 리스트에 담겨 있을 때,

#        filter를 이용하여 여기서 일반 이미지 파일만 혹은 썸네일 파일만 골라 내어라.


imgList = ['a_thumb.jpg', 'toto', 'ajaj.jpg', 'haha.jjj']


def ImgFileFilter(img):

    return filter(lambda x: (x.find('.jpg') > 0) or (x.find('_thumb') > 0), img)


if __name__=="__main__":

    print ImgFileFilter(imgList)

"""


"""

# Q5) 주어진 문자열(예: 'as soon as possible')에서 각 단어의 첫 글자를 취해서

# 하나의 단어를 만들어라. (split, map, join 이용)


def MakeChar(string):

    tmpList = map(lambda x: x[0], string.split())

    return ''.join(tmpList)


if __name__=='__main__':

    print MakeChar('as soon as possible')

"""  


"""

# Q6) data.txt 파일에 다음과 같은 내용이 저장되어 있다. 이들을 읽어 리스트 x에

# [1,4,7], 리스트 y에 [2,5,8], 리스트 z에 [3,6,9]가 저장되도록 map 함수를 이용하여

# 작성하라. (리스트 안의 숫자는 모두 정수형이어야 한다.)


def NumList(f):

    strList = f.readlines() # readlines는 리스트로 리턴

    x = map(lambda i: int(i[0]), strList)

    y = map(lambda i: int(i[2]), strList)

    z = map(lambda i: int(i[4]), strList)

    return x,y,z


if __name__=='__main__':

    import os

    os.chdir(os.getenv('HOME') + '/Desktop')

    f = open('data.txt', 'r')

    x, y, z = NumList(f)

    print 'x =',x

    print 'y =',y

    print 'z =',z

"""


"""

# Q7) N! (팩토리얼) 을 계산하는 함수 fact를 재귀적 함수로 만들어라. 


def fact(num):

    if num==1:

        return 1

    return num * fact(num-1)


if __name__=='__main__':

    print fact(5)

"""


"""

# Q8) 리스트의 구조를 변경하지 말고 리스트의 값을 바꾸는 함수를 작성하고 시험하라.

# 예를 들어, [3,2[3,[3],[4]]] 에서 3을 5로 바꾼다면 [5,2,[5,[5],[4]]] 결과가

# 나와야 한다. (재귀적 프로그래밍)


def ChangeValue(listVal):

    for i in range(len(listVal)):

        if listVal[i] == 3:

            listVal[i] = 5


        if type(listVal[i]) == type([]):

            ChangeValue(listVal[i])


if __name__=="__main__":

    tmpList = [3,2,[3,[3],[4]]]

    ChangeValue(tmpList)

    print tmpList

"""


'Programming > Python' 카테고리의 다른 글

모듈의 실행 ( __name__ == '__main__' )  (0) 2013.05.01
Module  (0) 2013.05.01
함수 객체의 속성  (0) 2013.04.28
함수적 프로그래밍 - reduce 내장 함수  (0) 2013.04.28
함수적 프로그래밍 - filter 내장 함수  (0) 2013.04.28
Posted by scii
:


함수 객체는 여러 가지의 속성을 갖는다. 



func_code

func_code는 함수의 코드 객체이다. 코드 객체는 '의사 컴파일(pseudo-compiled)' 된 실행 가능한 파이썬 코드이다. 코드 객체는 내장 compile() 함수에 의해 리턴되고 함수 객체의 func_code 속성으로 참조된다.

코드 객체는 코드에 관한 정보만을 가지고 있는 반면에 함수 객체는 함수를 수행하기 위한 여러 정보를 함께 가지고 있다.

예를 들어, 함수 객체는 기본적인 전역 공간을 가지고 있고, 함수 호출시 전달되지 않으면 자동 설정하는 기본 인수 값들을 가지고 있는 반면에 코드 객체는 그렇지 못하다. 또한 코드 객체는 변경 불가능한 자료형의 일종이다.


func_code 를 이용하여 함수를 호출할 일은 거의 없지만 유용한 정보를 추출해 내는 것은 가능하다. 


Posted by scii
: