파이썬 언어든 자바 언어든 뭐든 대형 프로젝트 시 어떤 파일을 불러온다던가 누가 만든 모듈 혹은 패키지를 가져와서 사용할 일이 많다. 근데 모듈, 패키지에 대해서 알지 못하면 못 불러오지 않겠나..
이제부터 모듈, 패키지에 대해 알아보자.
모듈이란, 프로그래밍이란 관점에서 기본적으로 본체에 대한 독립된 하위 단위라는 필연적인 개념의 큰 틀을 따르지만,
본체와 모듈 간에 가지고 있었던 문제들을 해결해나가는 과정 속에서 모듈이라는 것이 발전했다고 한다.
초기에는 단순 분리된 독립성의 모듈로 도입되었지만, 클래스 그리고 라이브러리가 향상됨에 따라 더욱 발전했다.
점차 객체화, 캡슐화, 모듈화 프로그래밍 기법 등 여러 기능들이 추가되면서 점차 영역이 나뉘어가고 있다.
이는 사실상 모듈의 독립성을 제대로 반영하지 못한다는 비난을 받을 수 있다.
한편 이러한 비난은 모듈 시스템, 모듈 프로그래밍이 갖는 현재의 한계를 인식하고 보다 안정적으로 발전하기 위해 효율적인 방향을 추구하는데 기여할 수 있다.
< 모듈의 예 >
패키지란, 어떤 일을 하기 위해 필요한 응용 소프트웨어 또는 일련의 컴퓨터 프로그램들을 지칭한다. 아무튼 묶인 것들이다.
패키지를 생성해두면 하나의 큰 도구(라이브러리)로 사용할 수가 있다. 한 페이지에 쭉 코드를 이어 붙여서 작성하는 것보다 필요한 부분 부분마다 파트를 나눠서 패키지로 저장하고 불러와서 main에 작성하면 더 간결하고 깔끔한 코딩이 가능하다. 추후 에러나 수정 또한 간편하다 ( 예를 들면 쇼핑몰의 사용자 리뷰란에 수정이 필요하면 있으면 해당 리뷰란 패키지(일종의 category)에서 수정을 하면 빨리 찾아 수정이 가능하다 )
클래스보다 더 큰? 개념이라 할 수 있겠다. 이제 코드를 보자.
from pkg.fibonacci import Fibonacci
Fibonacci.fib(300)
print("ex2 :", Fibonacci.fib2(400))
m1 = Fibonacci()
print(m1.title)
print("ex2 :",Fibonacci().title)
#사용 2(클래스) 권장 X
from pkg.fibonacci import *
Fibonacci.fib(600)
print("ex2 :", Fibonacci.fib2(500))
m1 = Fibonacci()
print(m1.title)
print("ex2 :",Fibonacci().title)
#사용 3( 클래스 )
from pkg.fibonacci import Fibonacci as fb # alias 주고 짦게 호출 사용가능
Fibonacci.fib(600)
print("ex3 :", fb.fib2(500))
m1 = Fibonacci()
print(m1.title)
print("ex3 :",fb().title)
# 사용 4( 함수 )
import pkg.calculations as c
print("ex 4 : ",c.add(10, 100))
print("ex 4 : ",c.mul(10, 100))
# 사용 5 (함수)
from pkg.calculations import div as d
print("ex5 :", int(d(100,10)))
# 사용 6
import pkg.prints as p
import builtins
p.prt1()
p.prt2()
print(dir(builtins))
# 단위 실행(독립적으로 파일 실행)
if __name__ == "__main__":
prt1()
prt2()
from pkg.(패키지이름) import Fibonacci
이 뜻은 패키지에서 Fibonacci 라는 클래스를 사용하겠다는 뜻이다. Fibonacci 라는 클래스 안에는 fib() ,fib2() 함수가 정의되어있다. 그리고 title 이라는 클래스 변수도 선언되어 있다.
(디폴트값을 "fibonacci" 로 설정해뒀다) 따라서 m1 인스턴스를 생성하고 m1.title을 하면 "fibonacci" 라는 값이 호출된다. ( 전에 말했듯 인스턴스 변수에 없으면 클래스 변수에서찾는다. m1 변수는 아직 아무것도 없다. )
import * 이란 뜻은 패키지의 모든 클래스 및 함수 등을 사용하겠다고 본 코드 페이지에 할당하는 것을 말한다.
(데이터가 많다면 굉장히 용량이 무거울 것이므로 비추한다.)
파이썬에서 정의된 클래스를 이용해 인스턴스를 생성하려면 다음과 같이 클래스 이름 뒤에 ()를 넣으면 된다. 어떻게 보면 인스턴스를 생성하는 과정은 함수를 호출하는 것과 비슷해 보인다.
그래서 헷갈리지 말라고 보통 class 의 이름은 "대문자"를 사용하는 것이다.
궁금증이 생겼다
m1 = Fibonacci()
print(m1.title)
print("ex2 :",Fibonacci().title)
위 코드에서 Fibonacci.title은 왜 안될까?
그런데 엄밀하게 파이썬에서는 메소드가 이렇게 돌아가지 않는다. 즉 메소드는 인스턴스 객체에 실제로 묶여있지 않다, 대신 약간의 꼼수를 써서 그렇게 보이도록 만든 것이다. 그렇다면 파이썬의 메소드는 어떻게 구현될까? 일단 기술적으로 파이썬의 메소드는 “특정 객체의 호출가능한 속성”이다. ‘호출 가능하다’는 것을 함수의 속성이며, 파이썬에서는 모든 것이 객체이기 때문에 함수 역시 객체이다. 결국 호출가능하다는 사실을 파이썬 해석기에게 알려주기 위해서 모든 파이썬 함수는 내부에 __call__이라는 속성을 가지고 있다. (실제로 f() 와 같은 식으로 어떤 객체를 ‘호출’하면 해당 객체의 __call__ 속성에 해당하는 함수가 실행된다
__call__이란
A)__call__은 instance가 함수로써 작동할 수 있도록 해줍니다.
class addN:
def __init__(self,N):
self.N=N
def __call__(self,num):
return self.N+num
add5=addN(5)
print(add5(3)) # 8
같은 결과를 내는 코드로
add5=lambda x:x+5 print(add5(3))
다만 lambda를 사용하는 경우 add3,add4,...와 같은 것들도 사용해야 할 때 코드가 더러울 질 수 있습니다.
이런 이유로 __call__을 사용합니다.
확실한 답변을 찾았다.
클래스 A 자체는 새로운 데이터 타입으로 보고
print(type(A)) 를 찍어보면 class type으로 나오고
__init__은 인스턴스를 생성할 때만 실행되는군요.
그래서 에러가 뜬거 였군요
print(type(A())) 을 해보니
<class '__main__.A'> 가 나왔습니다.
a = A() 처럼 a 에 할당하지않고도 A() 자체가 인스턴스화 된건가요?
그래서 print(A().title), print(a.title) 모두 가능한거군요?
다만 print(A.title) 은 안되는거구요
코드 8-11 데이터의 유형을 나타내는 데이터의 유형은 무엇일까?
>>> type(type(0)) # 0의 유형의 유형은
type (유형) <class 'type'> >>> type(type(type(0)))
# 0의 유형의 유형의 유형도 type (유형) <class 'type'>
type() 함수가 반환하는 데이터가 type이라는 데이터 유형임을 알 수 있다. 다시 말해, 데이터의 유형을 나타내기 위한 데이터가 존재한다는 뜻이다. 이 데이터가 바로 클래스다. int, float, str은 데이터 유형을 나타내는 데이터다. 0, 1, 2의 데이터 유형이 정수인 것처럼, int, float, str의 데이터 유형은 클래스다.
흠.. 시간을 너무 빼앗겼다. 아무튼..
#사용 3( 클래스 )
from pkg.fibonacci import Fibonacci as fb # alias 주고 짦게 호출 사용가능
Fibonacci.fib(600)
print("ex3 :", fb.fib2(500))
m1 = Fibonacci()
print(m1.title)
print("ex3 :",fb().title)
# 사용 4( 함수 )
import pkg.calculations as c
print("ex 4 : ",c.add(10, 100))
print("ex 4 : ",c.mul(10, 100))
# 사용 5 (함수)
from pkg.calculations import div as d
print("ex5 :", int(d(100,10)))
# 사용 6
import pkg.prints as p
import builtins
p.prt1()
p.prt2()
print(dir(builtins))
# 단위 실행(독립적으로 파일 실행)
if __name__ == "__main__":
prt1()
prt2()
as 는 alias 약어로 "별명" 이라는 뜻이다.
from pkg.fibonacci import Fibonacci as fb # alias 주고 짦게 호출 사용가능
위와 같이 하면 fb만으로 Fibonacci 클래스 안의 모든 속성 및 함수를 호출할 수 있다.
Fibonacci.fib(600)
print("ex3 :", fb.fib2(500))
m1 = Fibonacci()
print(m1.title)
print("ex3 :",fb().title)
위 코드로 실행이 간편하다.
from pkg.fibonacci import Fibonacci
위 코드의 경우 해석하면 "pkg 파일 안에 "점." 해줘서 들어가고 fibonacci.py 로부터 Fibonacci 라는 클래스를 불러온다"
는 뜻이다.
import builtins
print(dir(builtins))
위 코드를 입력하면 파이썬 빌트인 함수를 볼 수 있다.
아래는 독립적으로 파일을 실행할 수 있도록 하기 위해 쓴 코드이다. 공식처럼 암기해두자.
# 단위 실행(독립적으로 파일 실행) - 독립적으로 파일 테스트 할때 사용 ctrl + shift b 안눌러도 실행가능
if __name__ == "__main__": # <- 공식이다. 필요하면 외운다.(한글자만 틀려도 실행 안됌)
prt1()
prt2()
추가로 ___main__.클래스 가 궁금해졌다.
추후 조사할 것이다.
'python' 카테고리의 다른 글
python - 외부 파일 처리/ Excel , CSV 파일 읽기 및 쓰기 (0) | 2020.04.29 |
---|---|
python - 에러 및 예외 처리 (0) | 2020.04.28 |
python - 파일 읽기 / 쓰기 (2) | 2020.04.28 |
Python - 클래스 상속에 대해서 +(feat. overriding) (0) | 2020.04.26 |
Python - 클래스 변수와 인스턴스 변수 - 공부 생각 노트 (0) | 2020.04.26 |