λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Python

νŒ¨ν‚€μ§€μ™€ __init__파일

by μ„œμ•„λž‘πŸ˜ 2023. 5. 31.

 

νŒ¨ν‚€μ§€(Package)

 

νŒŒμ΄μ¬μ—μ„œ νŒ¨ν‚€μ§€λŠ” μžλ°”μ™€ λ™μΌν•˜κ²Œ 파일의 계측ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 그리고 λ‹€λ₯Έ νŒŒμΌμ— μ •μ˜λ˜μ–΄ μžˆλŠ” 클래슀λ₯Ό ν™œμš©ν•  λ•ŒλŠ” λͺ¨λ“ˆν˜•νƒœλ‘œ λΆˆλŸ¬μ˜¨λ‹€.

 

λ‹€μŒκ³Ό 같이 디렉토리 ꡬ쑰가 μžˆλ‹€κ³  κ°€μ •ν•˜μž.

person/
      __init__.py
      male/
      	  __init__.py
          run.py
      female/
      	    __init__.py
            run.py

 

Female/run.py의 test_run ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•΄λ³΄μž. λ‹€μŒκ³Ό 같이 μ‹€ν–‰ν•  수 μžˆλ‹€.

import person.female.run
person.female.run.test_run()

 

Person.Female.run의 ν˜•νƒœλ‘œ λͺ¨λ“ˆμ„ λΆˆλŸ¬μ™€μ„œ λͺ¨λ“ˆμ˜ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.

 

from person.female import run
run.test_run()

fromκ³Ό import둜 μ‹€ν–‰ν•  μˆ˜λ„ μžˆλ‹€.

 

from person.female.run import test_run
test_run()

μ΄λ²ˆμ—λŠ” test_runν•¨μˆ˜λ§Œ importν•΄μ„œ λ‹¨λ…μœΌλ‘œ μ‹€ν–‰ν–ˆλ‹€.

 

 

__init__.py

__init__.py νŒŒμΌμ€ ν•΄λ‹Ή 디렉터리가 νŒ¨ν‚€μ§€μ˜ μΌλΆ€μž„μ„ μ•Œλ €μ£ΌλŠ” 역할을 ν•œλ‹€. λ§Œμ•½ Person, Male, Female λ“± νŒ¨ν‚€μ§€μ— ν¬ν•¨λœ 디렉터리에 __init__.py νŒŒμΌμ΄ μ—†λ‹€λ©΄ νŒ¨ν‚€μ§€λ‘œ μΈμ‹λ˜μ§€ μ•ŠλŠ”λ‹€.

python3.3 λ²„μ „λΆ€ν„°λŠ” __init__.py νŒŒμΌμ΄ μ—†μ–΄λ„ νŒ¨ν‚€μ§€λ‘œ μΈμ‹ν•œλ‹€(PEP 420). ν•˜μ§€λ§Œ ν•˜μœ„ λ²„μ „ ν˜Έν™˜μ„ μœ„ν•΄ __init__.py νŒŒμΌμ„ μƒμ„±ν•˜λŠ” κ²ƒμ΄ μ•ˆμ „ν•œ λ°©λ²•μ΄λ‹€.

 

λ˜ν•œ, __init__.py νŒŒμΌμ€ νŒ¨ν‚€μ§€μ™€ κ΄€λ ¨λœ μ„€μ •μ΄λ‚˜ μ΄ˆκΈ°ν™” μ½”λ“œλ₯Ό 포함할 수 μžˆλ‹€. λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ ν™œμš©ν•  수 μžˆλŠ”λ°, μ•„λž˜μ— λͺ‡ 가지 예λ₯Ό λ“€μ–΄ μ‚΄νŽ΄λ³΄μž.

 

 

νŒ¨ν‚€μ§€ λ³€μˆ˜ 및 ν•¨μˆ˜ μ •μ˜

νŒ¨ν‚€μ§€ μˆ˜μ€€μ—μ„œ λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, game νŒ¨ν‚€μ§€μ˜ __init__.pyμ—μ„œ 곡톡 λ³€μˆ˜λ‚˜ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

# person.py
AGE = 35

def print_age_info():
    print(f"My age is {AGE}.")

μ΄λ ‡κ²Œ νŒ¨ν‚€μ§€μ˜ __init__.py νŒŒμΌμ— μ •μ˜λœ λ³€μˆ˜μ™€ ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©ν• μˆ˜ μžˆλ‹€.

>>> import person
>>> print(person.age)
35
>>> person.print_age_info()
My age is 35.

 

 

νŒ¨ν‚€μ§€ λ‚΄ λͺ¨λ“ˆμ„ 미리 import

__init__.pyμ—μ„œ νŒ¨ν‚€μ§€ λ‚΄μ˜ λ‹€λ₯Έ λͺ¨λ“ˆμ„ 미리 importν•˜μ—¬ νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œμ—μ„œ κ°„νŽΈν•˜κ²Œ μ ‘κ·Όν•  수 있게 ν•œλ‹€.

# person.py
from .male.run import test_run

AGE = 35

def print_age_info():
    print(f"My age is {AGE}.")

 

이제 νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œμ—μ„œλŠ” λ‹€μŒκ³Ό 같이 κ°„νŽΈν•˜κ²Œ Male νŒ¨ν‚€μ§€λ₯Ό 톡해 test_run ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

>>> import male
>>> male.test_run()

 

 

νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™”

__init__.pyμ—μ„œ νŒ¨ν‚€μ§€κ°€ 처음 λΆˆλŸ¬μ™€μ§ˆ λ•Œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°μ΄λ‚˜ μ„€μ • 파일 λ‘œλ“œμ™€ 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.

# person.py
from .male.run import test_run

AGE = 35

def print_age_info():
    print(f"My age is {AGE}.")
    
# Package Initialize
print("init!!!")

μ΄λ ‡κ²Œ ν•˜λ©΄ νŒ¨ν‚€μ§€κ°€ 처음 import 될 λ•Œ μ΄ˆκΈ°ν™” μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€.

>>> import person
init!!!

 

person νŒ¨ν‚€μ§€μ˜ μ΄ˆκΈ°ν™” μ½”λ“œλŠ” person νŒ¨ν‚€μ§€μ˜ ν•˜μœ„ λͺ¨λ“ˆμ˜ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  κ²½μš°μ—λ„ μ‹€ν–‰λœλ‹€.

>>> from person.male.run import test_run
init!!!

단, μ΄ˆκΈ°ν™” μ½”λ“œλŠ” ν•œλ²ˆ μ‹€ν–‰λœ ν›„μ—λŠ” λ‹€μ‹œ importλ₯Ό μˆ˜ν–‰ν•˜λ”λΌλ„ λ‹€μ‹œ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€. 예λ₯Ό λ“€μ–΄ λ‹€μŒκ³Ό 같이 person νŒ¨ν‚€μ§€λ₯Ό importν•œ 후에 ν•˜μœ„ λͺ¨λ“ˆμ„ λ‹€μ‹œ import ν•˜λ”λΌλ„ μ΄ˆκΈ°ν™” μ½”λ“œλŠ” 처음 ν•œλ²ˆλ§Œ μ‹€ν–‰λœλ‹€.

 

>>> import person
init!!!
>>> from person.male.run import test_run
>>>

 

 

__all__

μ΄λ²ˆμ—λŠ” λ‹€μŒμ„ 따라 ν•΄ 보자.

>>> from person.female import *
init!!!
>>> run.test_run()
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
NameError: name 'run' is not defined

 

λΆ„λͺ… person.female νŒ¨ν‚€μ§€μ—μ„œ λͺ¨λ“  것(*)을 importν•˜μ˜€μœΌλ―€λ‘œ run λͺ¨λ“ˆμ„ μ‚¬μš©ν•  수 μžˆμ–΄μ•Ό ν•  것 같은데 run μ΄λΌλŠ” 이름이 μ •μ˜λ˜μ§€ μ•Šμ•˜λ‹€λŠ” 이름 였λ₯˜(NameError)κ°€ λ°œμƒν–ˆλ‹€.

μ΄λ ‡κ²Œ νŠΉμ • λ””λ ‰ν„°λ¦¬μ˜ λͺ¨λ“ˆμ„ *λ₯Ό μ‚¬μš©ν•˜μ—¬ importν•  λ•Œμ—λŠ” λ‹€μŒκ³Ό 같이 ν•΄λ‹Ή λ””λ ‰ν„°λ¦¬μ˜ __init__.py νŒŒμΌμ— __all__ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜κ³  importν•  수 μžˆλŠ” λͺ¨λ“ˆμ„ μ •μ˜ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.

# female/__init__.py
__all__ = ['run']

μ—¬κΈ°μ—μ„œ __all__이 μ˜λ―Έν•˜λŠ” 것은 female λ””λ ‰ν„°λ¦¬μ—μ„œ * κΈ°ν˜Έλ₯Ό μ‚¬μš©ν•˜μ—¬ importν•  경우 이곳에 μ •μ˜λœ run λͺ¨λ“ˆλ§Œ importλœλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

μ°©κ°ν•˜κΈ° μ‰¬μš΄λ° from person.female.run import * λŠ” __all__κ³Ό 상관없이 무쑰건 importλœλ‹€. μ΄λ ‡κ²Œ __all__κ³Ό 상관없이 무쑰건 importλ˜λŠ” κ²½μš°λŠ” from a.b.c import * μ—μ„œ from의 λ§ˆμ§€λ§‰ ν•­λͺ©μΈ cκ°€ λͺ¨λ“ˆμΈ κ²½μš°μ΄λ‹€.

 

μœ„μ™€ 같이 __init__.py νŒŒμΌμ„ λ³€κ²½ν•œ ν›„ μœ„ λ‹€μ‹œ μ‹€ν–‰μ‹œν‚€λ©΄ 정상 μž‘λ™ν•œλ‹€.

>>> from person.female import *
init!!!
>>> run.test_run()

 

μ ˆλŒ€ κ²½λ‘œκ°€ μ•„λ‹Œ μƒλŒ€ κ²½λ‘œλ‘œλ„ λ‹Ήμ—°νžˆ import κ°€λŠ₯ν•˜λ‹€.

# female/run.py

from ..male.run import echo_run

def gogo():
	print("female run")
    echo_run()
    
>>>> female run
>>>> run

 

 

좜처: 점프 투 파이썬(https://wikidocs.net/1418)

λŒ“κΈ€