9. í´ëì¤Â¶
í´ëì¤ë ë°ì´í°ì 기ë¥ì í¨ê» 묶ë ë°©ë²ì ì ê³µí©ëë¤. ì í´ëì¤ë¥¼ ë§ëë ê²ì ê°ì²´ì ì í ì ë§ë¤ì´ì, ê·¸ íì ì ì¸ì¤í´ì¤ 를 ë§ë¤ ì ìëë¡ í©ëë¤. ê° í´ëì¤ ì¸ì¤í´ì¤ë ìí를 ì ì§í기 ìí´ ê·¸ ìì ìê² ì²¨ë¶ë ì´í¸ë¦¬ë·°í¸ë¥¼ ê°ì§ ì ììµëë¤. í´ëì¤ ì¸ì¤í´ì¤ë ìí를 ë°ê¾¸ê¸° ìí (í´ëì¤ì ìí´ ì ìë) ë©ìëë ê°ì§ ì ììµëë¤.
ë¤ë¥¸ íë¡ê·¸ëë° ì¸ì´ë¤ê³¼ ë¹êµí ë, íì´ì¬ì í´ëì¤ ë©ì»¤ëì¦ì ìµìíì ìë¡ì´ 문ë²ê³¼ ê°ë ì ì¨ì í´ëì¤ë¥¼ ì¶ê°í©ëë¤. C++ ê³¼ 모ëë¼-3 ìì ë°ê²¬ëë í´ëì¤ ë©ì»¤ëì¦ì í¼í©í©ëë¤. íì´ì¬ í´ëì¤ë ê°ì²´ ì§í¥í íë¡ê·¸ëë°ì 모ë íì¤ ê¸°ë¥ë¤ì ì ê³µí©ëë¤: í´ëì¤ ìì ë©ì»¤ëì¦ì ë¤ì¤ ë² ì´ì¤ í´ëì¤ë¥¼ íë½íê³ , ìì í´ëì¤ë ë² ì´ì¤ í´ëì¤ë í´ëì¤ë¤ì ì´ë¤ ë©ìëë ì¬ì ìí ì ìì¼ë©°, ë©ìëë ê°ì ì´ë¦ì ë² ì´ì¤ í´ëì¤ì ë©ìë를 í¸ì¶í ì ììµëë¤. ê°ì²´ë¤ì ììì ì¢ ë¥ì ë°ì´í°ë¥¼ ìì ì í ìì´ ê°ì§ ì ììµëë¤. 모ëê³¼ ë§ì°¬ê°ì§ë¡, í´ëì¤ë íì´ì¬ì ëì ì¸ ë³¸ì±ì í¨ê» ëëëë¤: ì¤í ìê°ì ë§ë¤ì´ì§ê³ , ë§ë¤ì´ì§ íìë ë ìì ë ì ììµëë¤.
C++ ì©ì´ë¡, ë³´íµ í´ëì¤ ë©¤ë²ë¤ì (ë°ì´í° 멤ë²ë¥¼ í¬í¨í´ì) public (ìì¸ë ìë ë¹ê³µê° ë³ì 를 ë³´ì¸ì) íê³ , 모ë ë§´ë² í¨ìë¤ì virtual ì ëë¤. 모ëë¼-3ì²ë¼, ê°ì²´ì 매ìëìì ê·¸ ê°ì²´ì 멤ë²ë¥¼ 참조íë ì¤ì ííì ììµëë¤: ë©ìë í¨ìë ê·¸ ê°ì²´ë¥¼ íííë ëª ìì ì¸ ì²« ë²ì§¸ ì¸ì를 ì ì¸íëë°, í¨ì í¸ì¶ ë 묵ìì ì¼ë¡ ì ê³µë©ëë¤. ì¤ëª°í í¬ì²ë¼, í´ëì¤ ìì ë ê°ì²´ì ëë¤. ì´ê²ì´ ìí¬í ê³¼ ì´ë¦ ë³ê²½ì ìí ê°ë ì ì ê³µí©ëë¤. C++ ë 모ëë¼-3 ìë ë¬ë¦¬, ë´ì¥íë ì¬ì©ìê° íì¥í기 ìí´ ë² ì´ì¤ í´ëì¤ë¡ ì¬ì©í ì ììµëë¤. ëí, C++ ì²ë¼, í¹ë³í 문ë²ì ê°ë ëë¶ë¶ì ë´ì¥ ì°ì°ìë¤ì (ì°ì ì°ì°ì, ìë¸ì¤í¬ë¦½í , ë±ë±) í´ëì¤ ì¸ì¤í´ì¤ì ëí´ ìë¡ ì ìë ì ììµëë¤.
(í´ëì¤ì ëí´ ë³´í¸ì ì¼ë¡ ë°ìë¤ì¬ì§ë ì©ì´ë¤ì´ ìë ìíìì, ì´ë°ê¸ ì¤ëª°í í¬ë C++ ì©ì´ë¤ì ì¬ì©í ê²ì ëë¤. C++ ë³´ë¤ ê°ì²´ ì§í¥ì ê°ë ë¤ì´ íì´ì¬ì ê²ê³¼ ë ê°ê¹ì°ë¯ë¡ 모ëë¼-3 ì©ì´ë¥¼ ì¬ì©í ìë ìì§ë§, ë¤ì´ë³¸ ë ìë¤ì´ ë³ë¡ ìì ê²ì¼ë¡ ììí©ëë¤.)
9.1. ì´ë¦ê³¼ ê°ì²´ì ê´í íë§ë¶
ê°ì²´ë ê°ì²´ì±(individuality)ì ê°ê³ , ì¬ë¬ ê°ì ì´ë¦ì´ (ì¬ë¬ ê°ì ì¤ì½íìì) ê°ì ê°ì²´ì ì°ê²°ë ì ììµëë¤. ì´ê²ì ë¤ë¥¸ ì¸ì´ë¤ììë ìì¼ë¦¬ì´ì±(aliasing) ì´ë¼ê³ ìë ¤ì ¸ ììµëë¤. ë³´íµ íì´ì¬ì ì²ì ë³¼ ë ì´ ì ì ëì´ íê°íì§ë ìê³ , ë¶ë³ 기본íë¤ (ì«ì, 문ìì´, íí)ì ë¤ë£¨ë ëìì ìì íê² ë¬´ìí ì ììµëë¤. íì§ë§, ìì¼ë¦¬ì´ì±ë 리ì¤í¸, ëì ë리ë ê·¸ ë°ì ë¤ë¥¸ ê°ë³ ê°ì²´ë¤ì ìë°íë íì´ì¬ ì½ëì ì미ì ê·¹ì ì¸ í¨ê³¼ë¥¼ ì¤ ì ììµëë¤. ì´ê²ì ë³´íµ íë¡ê·¸ë¨ì ííì´ ëëë°, ìì¼ë¦¬ì´ì¤ë ì´ë¤ ë©´ìì í¬ì¸í°ì²ë¼ ëìí기 ë문ì ëë¤. ì를 ë¤ì´, 구íì´ í¬ì¸í°ë§ ì ë¬í기 ë문ì, ê°ì²´ë¥¼ ì ë¬íë ë¹ì©ì´ ì ê² ëëë¤; ê·¸ë¦¬ê³ í¨ìê° ì¸ìë¡ ì ë¬ë ê°ì²´ë¥¼ ìì íë©´, í¸ì¶ìë ê·¸ ë³ê²½ì ë³´ê² ë©ëë¤ â ì´ê²ì íì¤ì¹¼ìì ì¬ì©ëë ë ê°ì§ ìë¡ ë¤ë¥¸ ì¸ì ì ë¬ ë©ì»¤ëì¦ì íì를 ì ê±°í©ëë¤.
9.2. íì´ì¬ ì¤ì½íì ì´ë¦ ê³µê°Â¶
í´ëì¤ë¥¼ ìê°í기 ì ì, íì´ì¬ì ì¤ì½í ê·ì¹ì ëí´ ëª ê°ì§ ë§í ê²ì´ ììµëë¤. í´ëì¤ ì ìë ì´ë¦ ê³µê°ì¼ë¡ ê¹ëí ìë ¹ì ë¶ë¦¬ê³ , ì¬ë¬ë¶ì 무ìì´ ì¼ì´ëëì§ ìì í ì´í´í기 ìí´ ì¤ì½íì ì´ë¦ ê³µê°ì´ ì´ë»ê² ëìíëì§ ì íìê° ììµëë¤. ë§ë¶ì¬ ë§íìë©´, ì´ ì£¼ì ì ëí ì§ìì 모ë ê³ ê¸ íì´ì¬ íë¡ê·¸ë머ìê² ì¸ëª¨ê° ììµëë¤.
ëª ê°ì§ ì ìë¡ ììí©ìë¤.
ì´ë¦ ê³µê° ì ì´ë¦ìì ê°ì²´ë¡ ê°ë 매íì
ëë¤. ëë¶ë¶ì ì´ë¦ ê³µê°ì íì¬ íì´ì¬ ëì
ëë¦¬ë¡ êµ¬íëì´ ìì§ë§, ë³´íµ ë¤ë¥¸ ìì¼ë¡ë ìì차릴 ì ìê³ (ì±ë¥ì ìì¸ì
ëë¤), ìì¼ë¡ë ë°ë ì ììµëë¤. ì´ë¦ ê³µê°ì ìë: ë´ì¥ ì´ë¦ë¤ì ì§í© (abs() ì ê°ì í¨ìë¤ê³¼ ë´ì¥ ìì¸ ì´ë¦ë¤ì í¬í¨í©ëë¤); 모ëì ì ì ì´ë¦ë¤; í¨ì í¸ì¶ììì ì§ì ì´ë¦ë¤. ì´ë¤ ì미ìì ê°ì²´ì ì´í¸ë¦¬ë·°í¸ ì§í©ë ì´ë¦ ê³µê°ì íì±í©ëë¤. ì´ë¦ ê³µê°ì ëí´ ììì¼ í ì¤ìí ê²ì ìë¡ ë¤ë¥¸ ì´ë¦ ê³µê°ë¤ì ì´ë¦ ê°ìë ìë¬´ë° ê´ê³ê° ìë¤ë ê²ì
ëë¤; ì를 ë¤ì´, ë ê°ì ìë¡ ë¤ë¥¸ 모ëë¤ì 모ë í¼ë ìì´ í¨ì maximize 를 ì ìí ì ììµëë¤ â 모ëì ì¬ì©ìë¤ì 모ë ì´ë¦ì ìì ë¶ì¬ì¼ í©ëë¤.
ê·¸ë°ë°, ì ë ì´í¸ë¦¬ë·°í¸ ë¼ë ë¨ì´ë¥¼ ì ë¤ì ì¤ë 모ë ì´ë¦ì ì¬ì©í©ëë¤ â ì를 ë¤ì´, ííì z.real ìì, real ë ê°ì²´ z ì ì´í¸ë¦¬ë·°í¸ì
ëë¤. ìë°íê² ë§í´ì, 모ëì ìë ì´ë¦ë¤ì ëí 참조ë ì´í¸ë¦¬ë·°í¸ 참조ì
ëë¤: ííì modname.funcname ìì, modname ì 모ë ê°ì²´ê³ funcname ë ê·¸ê²ì ì´í¸ë¦¬ë·°í¸ì
ëë¤. ì´ ê²½ì°ìë ì°ì°íë 모ëì ì´í¸ë¦¬ë·°í¸ì 모ëìì ì ìë ì ì ì´ë¦ ê°ì ì§ì ì ì¸ ë§¤íì´ ìê¹ëë¤: ê°ì ì´ë¦ ê³µê°ì ê³µì í©ëë¤! [1]
ì´í¸ë¦¬ë·°í¸ë ì½ê¸° ì ì© ì´ê±°ë ì°ê¸° ê°ë¥í ì ììµëë¤. íìì ê²½ì°, ì´í¸ë¦¬ë·°í¸ì ëí ëì
ì´ ê°ë¥í©ëë¤. 모ë ì´í¸ë¦¬ë·°í¸ë ì°ê¸° ê°ë¥í©ëë¤: modname.the_answer = 42 ë¼ê³ ì¸ ì ììµëë¤. ì°ê¸° ê°ë¥í ì´í¸ë¦¬ë·°í¸ë del 문ì¼ë¡ ìì í ìë ììµëë¤. ì를 ë¤ì´, del modname.the_answer ë modname ë¼ë ì´ë¦ì ê°ì²´ìì ì´í¸ë¦¬ë·°í¸ the_answer 를 ì ê±°í©ëë¤.
ì´ë¦ ê³µê°ë¤ì ìë¡ ë¤ë¥¸ ìê°ì ë§ë¤ì´ì§ê³ ìë¡ ë¤ë¥¸ ìëª
ì ê°ìµëë¤. ë´ì¥ ì´ë¦ë¤ì ë´ë ì´ë¦ ê³µê°ì íì´ì¬ ì¸í°í리í°ê° ììí ë ë§ë¤ì´ì§ê³ ììí ì§ìì§ì§ ììµëë¤. 모ëì ì ì ì´ë¦ ê³µê°ì 모ë ì ì를 ì½ë ëì ë§ë¤ì´ì§ëë¤; ë³´íµ, 모ë ì´ë¦ ê³µê°ì ì¸í°í리í°ê° ëë ëê¹ì§ ë¨ìµëë¤. ì¸í°í리í°ì ìµìì í¸ì¶ ë문ì ì¤íëë, ì¤í¬ë¦½í¸ íì¼ì´ë ëííì¼ë¡ ì½íë, 문ì¥ë¤ì __main__ ì´ë¼ê³ ë¶ë¦¬ë 모ë ì¼ë¶ë¡ ì¬ê²¨ì ¸ì ê·¸ ë¤ ìì ì ì´ë¦ ê³µê°ì ê°ìµëë¤. (ë´ì¥ ì´ë¦ë¤ ëí 모ëì ìíëë°; ì´ê²ì builtins ë¼ ë¶ë¦
ëë¤.)
í¨ìì ì§ì ì´ë¦ ê³µê°ì í¨ìê° í¸ì¶ë ë ë§ë¤ì´ì§ê³ , í¨ìê° ë³µê·íê±°ë í¨ì ë´ìì ì²ë¦¬ëì§ ìë ìì¸ë¥¼ ì¼ì¼í¬ ë ìì ë©ëë¤. (ì¬ì¤, ìì´ë²ë¦°ë¤ë ê²ì´ ì¤ì ë¡ ì¼ì´ëë ì¼ì ëí ë ì¢ì ì¤ëª ì ëë¤.) ë¬¼ë¡ , ì¬ê·ì í¸ì¶ì ê°ê° ì기 ìì ë§ì ì§ì ì´ë¦ ê³µê°ì ê°ìµëë¤.
ì¤ì½í ë ì´ë¦ ê³µê°ì ì§ì ì¡ì¸ì¤í ì ìë íì´ì¬ íë¡ê·¸ë¨ì í ì¤í¸ ì ì¸ ììì ëë¤. ì¬ê¸°ìì âì§ì ì¡ì¸ì¤ ê°ë¥íâ ì´ë ì´ë¦ì ëí ì ê·íëì§ ìì ì°¸ì¡°ê° ê·¸ ì´ë¦ ê³µê°ìì ì´ë¦ì ì°¾ì¼ë ¤ê³ ìëíë¤ë ì미ì ëë¤.
ì¤ì½íê° ì ì ì¼ë¡ ê²°ì ë¨ìë ë¶êµ¬íê³ , ëì ì¼ë¡ ì¬ì©ë©ëë¤. ì¤í ì¤ ì´ë ìì ììê±´, ì´ë¦ ê³µê°ì ì§ì ì¡ì¸ì¤ ê°ë¥í, ì¸ ê°ë ë¤ ê°ì ì¤ì²©ë ì¤ì½íê° ììµëë¤:
ê°ì¥ 먼ì ê²ìëë, ê°ì¥ ë´ë¶ì ì¤ì½íë ì§ì ì´ë¦ë¤ì í¬í¨í©ëë¤
ëë¬ì¸ê³ ìë í¨ìë¤ì ì¤ì½íë, ê°ì¥ ê°ê¹ì´ì ëë¬ì¸ë ì¤ì½íë¡ë¶í° ê²ìì´ ììë©ëë¤, ë¹ ì§ì(non-local) ì´ì§ë§ ë¹ ì ì(non-global) ì´ë¦ë¤ì í¬í¨í©ëë¤
ë§ì§ë§ ì§ì ì ì¤ì½íë íì¬ ëª¨ëì ì ì ì´ë¦ë¤ì í¬í¨í©ëë¤
(ê°ì¥ ëì¤ì ê²ìëë) ê°ì¥ ì¸ë¶ì ì¤ì½íë ë´ì¥ ì´ë¦ë¤ì í¬í¨íê³ ìë ì´ë¦ ê³µê°ì ëë¤.
ì´ë¦ì globalë¡ ì ì¸íë©´, 모ë 참조ì ëì
ì 모ëì ì ì ì´ë¦ë¤ì í¬í¨íë ë§ì§ë§ ë°ë¡ ì ì¤ì½íë¡ ë°ë¡ ê°ëë¤. ê°ì¥ ë´ë¶ì ì¤ì½í ë°ê¹¥ìì ë°ê²¬ëë ë³ìë¤ì ì¬ì°ê²°íë ¤ë©´, nonlocal í¤ìë를 ì¬ì©í ì ììµëë¤; nonlocal ë¡ ì ì¸ëì§ ìì¼ë©´, ê·¸ ë³ìë¤ì ì½ê¸° ì ì©ì
ëë¤ (ê·¸ë° ë³ìì ì°ë ¤ê³ íë©´ ë¨ìí ê°ì¥ ë´ë¶ì ì¤ì½íì ì ì§ì ë³ì를 ë§ë¤ê² ëì´, ê°ì ì´ë¦ì ë°ê¹¥ ë³ì를 ë°ê¾¸ì§ ìê³ ë¨ê²¨ë¡ëë¤).
ë³´íµ, ì§ì ì¤ì½íë íì¬ í¨ìì ì§ì ì´ë¦ë¤ì (í ì¤í¸ ì ì¼ë¡) 참조í©ëë¤. í¨ì ë°ê¹¥ìì, ì§ì ì¤ì½íë ì ì ì¤ì½íì ê°ì ì´ë¦ ê³µê°ì 참조í©ëë¤: 모ëì ì´ë¦ ê³µê°. í´ëì¤ ì ìë¤ì ì§ì ì¤ì½íì ë íëì ì´ë¦ ê³µê°ì ë°°ì¹í©ëë¤.
ì¤ì½íê° í ì¤í¸ ì ì¼ë¡ ê²°ì ëë¤ë ê²ì 깨ë«ë ê²ì ì¤ìí©ëë¤: 모ëìì ì ìë í¨ìì ì ì ì¤ì½íë, ì´ëìì ì´ë¤ ìì¼ë¦¬ì´ì¤ë¥¼ íµí´ ê·¸ í¨ìê° í¸ì¶ëëì§ì ê´ê³ìì´, ê·¸ 모ëì ì´ë¦ ê³µê°ì ëë¤. ë°ë©´ì, ì´ë¦ì ì¤ì ë¡ ê²ìíë ê²ì ì¤íìê°ì ëì ì¼ë¡ ìíë©ëë¤ â íì§ë§, ì¸ì´ ì ìë ì»´íì¼ ìì ì ì ì ì¸ ì´ë¦ ê²°ì ì í¥í´ ì§ííê³ ìì´ì, ëì ì¸ ì´ë¦ ê²°ì ì ìì¡´íì§ ë§ìì¼ í©ëë¤! (ì¬ì¤, ì§ì ë³ìë¤ì ì´ë¯¸ ì ì ì¼ë¡ ê²°ì ë©ëë¤.)
íì´ì¬ì í¹ë³í í¹ì§ì â globalì´ë nonlocal ë¬¸ì´ ìì ë â ì´ë¦ì ëì
íë©´ íì ê°ì¥ ë´ë¶ì ì¤ì½íë¡ ê°ë¤ë ê²ì
ëë¤. ëì
ì ë°ì´í°ë¥¼ ë³µì¬íì§ ììµëë¤ â ì´ë¦ì ë¨ì§ ê°ì²´ì ì°ê²°í ë¿ì
ëë¤. ìì ë ë§ì°¬ê°ì§ì
ëë¤: ë¬¸ì¥ del x ë ì§ì ì¤ì½íê° ì°¸ì¡°íë ì´ë¦ ê³µê°ìì x ì ì°ê²°ì ì ê±°í©ëë¤. ì¬ì¤, ì ì´ë¦ì ìê°íë 모ë ì°ì°ì ì§ì ì¤ì½í를 ì¬ì©í©ëë¤: í¹í, import 문과 í¨ì ì ìë 모ëì´ë í¨ì ì´ë¦ì ì§ì ì¤ì½íì ì°ê²°í©ëë¤.
global 문ì í¹ì ë³ìê° ì ì ì¤ì½íì ìì¼ë©° 그곳ì ì¬ì°ê²°ëì´ì¼ í¨ì ê°ë¦¬í¬ ë ì¬ì©ë ì ììµëë¤; nonlocal 문ì í¹ì ë³ìê° ëë¬ì¸ë ì¤ì½íì ìì¼ë©° 그곳ì ì¬ì°ê²°ëì´ì¼ í¨ì ê°ë¦¬íµëë¤.
9.2.1. ì¤ì½íì ì´ë¦ ê³µê° ì¶
ì´ê²ì ì´ë»ê² ìë¡ ë¤ë¥¸ ì¤ì½íì ì´ë¦ ê³µê°ì 참조íê³ , global ê³¼ nonlocal ì´ ë³ì ì°ê²°ì ì´ë¤ ìí¥ì 주ëì§ë¥¼ ë³´ì¬ì£¼ë ìì
ëë¤:
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
scope_test()
print("In global scope:", spam)
ìì ì½ëì ì¶ë ¥ì ì´ë ê² ë©ëë¤:
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
ì´ë»ê² ì§ì ëì
ì´ (ì´ê²ì´ 기본ì
ëë¤) scope_test ì spam ì°ê²°ì ë°ê¾¸ì§ ìëì§ì ì ìíì¸ì. nonlocal ëì
ì scope_test ì spam ì°ê²°ì ë°ê¾¸ê³ global ëì
ì 모ë ìì¤ì ì°ê²°ì ë°ê¿ëë¤.
global ëì
ì ìë spam ì ì°ê²°ì´ ìë¤ë ê²ë ë³¼ ì ììµëë¤.
9.3. í´ëì¤ìì 첫 ë§ë¨Â¶
í´ëì¤ë ì½ê°ì ì 문ë²ê³¼ ì¸ ê°ì ê°ì²´íê³¼ ëª ê°ì§ ì ê°ë ë¤ì ëì í©ëë¤.
9.3.1. í´ëì¤ ì ì 문ë²Â¶
í´ëì¤ ì ìì ê°ì¥ ê°ë¨í ííë ì´ë ê² ìê²¼ìµëë¤:
class ClassName:
<statement-1>
.
.
.
<statement-N>
í¨ì ì ì(def 문)ì²ë¼, í´ëì¤ ì ìë ì´ë¤ í¨ê³¼ê° ì기기 ìí´ìë 먼ì ì¤íëì´ì¼ í©ëë¤. (ìì컨ë í´ëì¤ ì ì를 if 문ì ë¶ê¸°ë í¨ì ë´ë¶ì ëì ì ììµëë¤)
ì¤ì¬ì ì¼ë¡, í´ëì¤ ì ì ë´ë¶ì 문ì¥ë¤ì ë³´íµ í¨ì ì ìë¤ì´ì§ë§, ë¤ë¥¸ 문ì¥ë¤ë íë½ëê³ ëë¡ ì¸ëª¨ê° ììµëë¤ â ëì¤ì ì´ ì£¼ì ë¡ ëìì¬ ê²ì ëë¤. í´ëì¤ ë´ë¶ì í¨ì ì ìë ë³´íµ, ë©ìë í¸ì¶ ê·ì½ì ìí¥ì ë°ì, í¹ë³í ííì ì¸ì 목ë¡ì ê°ìµëë¤. â ë¤ì, ì´ê²ì ë¤ìì ì¤ëª ë©ëë¤.
í´ëì¤ ì ìì ì§ì í ë, ì ì´ë¦ ê³µê°ì´ ë§ë¤ì´ì§ê³ ì§ì ì¤ì½íë¡ ì¬ì©ë©ëë¤ â ê·¸ëì, 모ë ì§ì ë³ìë¤ë¡ì ëì ì ì´ ì ì´ë¦ ê³µê°ì¼ë¡ ê°ëë¤. í¹í, í¨ì ì ìë ì í¨ìì ì´ë¦ì ì´ê³³ì ì°ê²°í©ëë¤.
í´ëì¤ ì ìê° (ëì íµí´) ì ìì ì¼ë¡ ëë ë, í´ëì¤ ê°ì²´ ê° ë§ë¤ì´ì§ëë¤. ì´ê²ì 기본ì ì¼ë¡ í´ëì¤ ì ì ë문ì ë§ë¤ì´ì§ ì´ë¦ ê³µê°ì ë´ì©ë¬¼ë¤ì ê°ì¸ë ì¸ê°ì
ëë¤; ë¤ì ì¹ì
ìì í´ëì¤ ê°ì²´ì ëí´ ë ë°°ì°ê² ë©ëë¤. ìëì ì§ì ì¤ì½íê° (í´ëì¤ ì ìì ë¤ì´ê°ê¸° ì§ì ì ì í¨íë ê²) ë¤ì ì¬ì©ëê³ , í´ëì¤ ê°ì²´ë í´ëì¤ ì ì í¤ëìì 주ì´ì§ í´ëì¤ ì´ë¦ (ììì ClassName) ì¼ë¡ ì¬ê¸°ì ì°ê²°ë©ëë¤.
9.3.2. í´ëì¤ ê°ì²´Â¶
í´ëì¤ ê°ì²´ë ë ì¢ ë¥ì ì°ì°ì ì§ìí©ëë¤: ì´í¸ë¦¬ë·°í¸ 참조ì ì¸ì¤í´ì¤ ë§ë¤ê¸°.
ì´í¸ë¦¬ë·°í¸ 참조 ë íì´ì¬ì 모ë ì´í¸ë¦¬ë·°í¸ 참조ì ì¬ì©ëë íì¤ ë¬¸ë²ì ì¬ì©í©ëë¤: obj.name. ì¬ë°ë¥¸ ì´í¸ë¦¬ë·°í¸ ì´ë¦ì í´ëì¤ ê°ì²´ê° ë§ë¤ì´ì§ ë í´ëì¤ì ì´ë¦ ê³µê°ì ìë 모ë ì´ë¦ì
ëë¤. ê·¸ëì, í´ëì¤ ì ìê° ì´ë ê² ë ë:
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
MyClass.i ì MyClass.f ë ì¬ë°ë¥¸ ì´í¸ë¦¬ë·°í¸ ì°¸ì¡°ê³ , ê°ê¸° ì ìì í¨ì ê°ì²´ë¥¼ ëë ¤ì¤ëë¤. í´ëì¤ ì´í¸ë¦¬ë·°í¸ë ëì
í ìë ìì´ì, ëì
ì íµí´ MyClass.i ì ê°ì ë³ê²½í ì ììµëë¤. __doc__ ë ìì ì¬ë°ë¥¸ ì´í¸ë¦¬ë·°í¸ê³ , í´ëì¤ì ìíë ë
ì¤í¸ë§ì ëë ¤ì¤ëë¤: "A simple example class".
í´ëì¤ ì¸ì¤í´ì¤ ë§ë¤ê¸° ë í¨ì í기ë²ì ì¬ì©í©ëë¤. í´ëì¤ ê°ì²´ê° í´ëì¤ì ì ì¸ì¤í´ì¤ë¥¼ ëë ¤ì£¼ë 매ê°ë³ì ìë í¨ìì¸ ì²´í©ëë¤. ì를 ë¤ì´ (ìì í´ëì¤ë¥¼ ê°ì íë©´):
x = MyClass()
ë í´ëì¤ì ì ì¸ì¤í´ì¤ 를 ë§ë¤ê³ ì´ ê°ì²´ë¥¼ ì§ì ë³ì x ì ëì
í©ëë¤.
ì¸ì¤í´ì¤ ë§ë¤ê¸° ì°ì° (í´ëì¤ ê°ì²´ âí¸ì¶í기â) ì ë¹ ê°ì²´ë¥¼ ë§ëëë¤. ë§ì í´ëì¤ë í¹ì í ì´ê¸° ìíë¡ ì»¤ì¤í°ë§ì´ì¦ë ì¸ì¤í´ì¤ë¡ ê°ì²´ë¥¼ ë§ëë ê²ì ì¢ìí©ëë¤. ê·¸ëì í´ëì¤ë ì´ë° ìì¼ë¡ __init__() ë¼ë ì´ë¦ì í¹ì ë©ìë ì ìí ì ììµëë¤:
def __init__(self):
self.data = []
í´ëì¤ê° __init__() ë©ìë를 ì ìí ë, í´ëì¤ ì¸ì¤í´ì¤ ë§ë¤ê¸°ë ìë¡ ë§ë¤ì´ì§ í´ëì¤ ì¸ì¤í´ì¤ì ëí´ ìëì¼ë¡ __init__() 를 í¸ì¶í©ëë¤. ê·¸ëì ì´ ììì, ì ì´ê¸°íë ì¸ì¤í´ì¤ë¥¼ ì´ë ê² ì»ì ì ììµëë¤:
x = MyClass()
ë¬¼ë¡ , __init__() ë©ìëë ë ëì ì ì°ì±ì ìí´ ì¸ìë¤ì ê°ì§ ì ììµëë¤. ê·¸ ê²½ì°, í´ëì¤ ì¸ì¤í´ì¤ ë§ë¤ê¸° ì°ì°ìë¡ ì£¼ì´ì§ ì¸ìë¤ì __init__() ë¡ ì ë¬ë©ëë¤. ì를 ë¤ì´,
>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
9.3.3. ì¸ì¤í´ì¤ ê°ì²´Â¶
ì´ì ì¸ì¤í´ì¤ ê°ì²´ë¡ 무ìì í ì ììê¹? ì¸ì¤í´ì¤ ê°ì²´ê° ì´í´íë ì¤ì§ íê°ì§ ì°ì°ì ì´í¸ë¦¬ë·°í¸ 참조ì ëë¤. ë ê°ì§ ì¢ ë¥ì ì¬ë°ë¥¸ ì´í¸ë¦¬ë·°í¸ ì´ë¦ì´ ììµëë¤: ë°ì´í° ì´í¸ë¦¬ë·°í¸ì ë©ìë.
Data attributes correspond to âinstance variablesâ in Smalltalk, and to âdata
membersâ in C++. Data attributes need not be declared; like local variables,
they spring into existence when they are first assigned to. For example, if
x is the instance of MyClass created above, the following piece of
code will print the value 16, without leaving a trace:
x.counter = 1
while x.counter < 10:
x.counter = x.counter * 2
print(x.counter)
del x.counter
ë¤ë¥¸ ì¸ì¤í´ì¤ ì´í¸ë¦¬ë·°í¸ 참조ë ë©ìë ì ëë¤. ë©ìëë ê°ì²´ì âìíëâ í¨ìì ëë¤.
ì¸ì¤í´ì¤ ê°ì²´ì ì¬ë°ë¥¸ ë©ìë ì´ë¦ì ê·¸ê²ì í´ëì¤ì ë¬ë ¤ììµëë¤. ì ìì, í¨ì ê°ì²´ì¸ í´ëì¤ì 모ë ì´í¸ë¦¬ë·°í¸ë¤ì ììíë ì¸ì¤í´ì¤ì ë©ìëë¤ì ì ìí©ëë¤. ê·¸ëì ì°ë¦¬ì ìì ìì, x.f ë ì¬ë°ë¥¸ ë©ìë 참조ì¸ë°, MyClass.f ê° í¨ìì´ê¸° ë문ì
ëë¤. íì§ë§ x.i ë ê·¸ë ì§ ììë°, MyClass.i ê° í¨ìê° ìë기 ë문ì
ëë¤. ê·¸ë¬ë, x.f ë MyClass.f ì ê°ì ê²ì´ ìëëë¤ â ì´ê²ì í¨ì ê°ì²´ê° ìëë¼ ë©ìë ê°ì²´ ì
ëë¤.
9.3.4. ë©ìë ê°ì²´Â¶
ë³´íµ, ë©ìëë ì°ê²°ëìë§ì í¸ì¶ë©ëë¤:
x.f()
If x = MyClass(), as above, this will return the string 'hello world'.
However, it is not necessary to call a method right away: x.f is a method
object, and can be stored away and called at a later time. For example:
xf = x.f
while True:
print(xf())
ë ììí ê³ì hello world 를 ì¸ìí©ëë¤.
ë©ìëê° í¸ì¶ë ë ì íí ì´ë¤ ì¼ì´ ì¼ì´ë ê¹? f() ì í¨ì ì ìê° ì¸ì를 ì§ì íììë ë¶êµ¬íê³ , ììì x.f() ë ì¸ì ìì´ í¸ì¶ë ê²ì ììì±ì ê²ì
ëë¤. ì¸ìë ì´ë»ê² ë 걸ê¹? íì¤í íì´ì¬ì ì¸ì를 íìë¡ íë í¨ì를 ì¸ì ìì´ í¸ì¶íë©´ ìì¸ë¥¼ ì¼ì¼íµëë¤ â ì¸ìê° ì¤ì ë¡ë ì¬ì©ëì§ ìëë¤ í´ëâ¦
ì¤ì ë¡, ì¬ë¬ë¶ì ëµì ì§ìí ì ììµëë¤: ë©ìëì í¹ë³í¨ì ì¸ì¤í´ì¤ ê°ì²´ê° í¨ìì 첫 ë²ì§¸ ì¸ìë¡ ì ë¬ëë¤ë ê²ì
ëë¤. ì°ë¦¬ ììì, í¸ì¶ x.f()ë ì íí MyClass.f(x) ì ëë±í©ëë¤. ì¼ë°ì ì¼ë¡, n ê°ì ì¸ìë¤ì 목ë¡ì¼ë¡ ë©ìë를 í¸ì¶íë ê²ì, 첫 ë²ì§¸ ì¸ì ìì ë©ìëì ì¸ì¤í´ì¤ ê°ì²´ë¥¼ ì½ì
í´ì ë§ë ì¸ì 목ë¡ì¼ë¡ ììíë í¨ì를 í¸ì¶íë ê²ê³¼ ëë±í©ëë¤.
ì¼ë°ì ì¼ë¡, ë©ìëë ë¤ìê³¼ ê°ì´ ìëí©ëë¤. ë°ì´í° ì´í¸ë¦¬ë·°í¸ê° ìë ì¸ì¤í´ì¤ ì´í¸ë¦¬ë·°í¸ë¥¼ 참조íë©´, ê·¸ê²ì í´ëì¤ê° ê²ìë©ëë¤. ë§ì½ ê·¸ ì´ë¦ì´ í¨ì ê°ì²´ì¸ ì¬ë°ë¥¸ í´ëì¤ ì´í¸ë¦¬ë·°í¸ë©´, ì¸ì¤í´ì¤ ê°ì²´ì í¨ì ê°ì²´ì ëí ì°¸ì¡°ê° í¨ê» ë©ìë ê°ì²´ë¡ í¬ì¥ë©ëë¤. ë©ìë ê°ì²´ê° ì¸ì 목ë¡ì¼ë¡ í¸ì¶ëë©´, ì¸ì¤í´ì¤ ê°ì²´ì ì¸ì 목ë¡ì¼ë¡ë¶í° ì ì¸ì 목ë¡ì´ 구ì±ë í, í¨ì ê°ì²´ë¥¼ ì´ ì ì¸ì 목ë¡ì¼ë¡ í¸ì¶í©ëë¤.
9.3.5. í´ëì¤ì ì¸ì¤í´ì¤ ë³ì¶
ì¼ë°ì ì¼ë¡ ë§í´ì, ì¸ì¤í´ì¤ ë³ìë ì¸ì¤í´ì¤ë³ ë°ì´í°ë¥¼ ìí ê²ì´ê³ í´ëì¤ ë³ìë ê·¸ í´ëì¤ì 모ë ì¸ì¤í´ì¤ìì ê³µì ëë ì´í¸ë¦¬ë·°í¸ì ë©ìë를 ìí ê²ì ëë¤:
class Dog:
kind = 'canine' # 모ë ì¸ì¤í´ì¤ê° ê³µì íë í´ëì¤ ë³ì
def __init__(self, name):
self.name = name # ê° ì¸ì¤í´ì¤ì ê³ ì í ì¸ì¤í´ì¤ ë³ì
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind # 모ë ì¸ì¤í´ì¤ê° ê³µì íë ë³ì
'canine'
>>> e.kind # 모ë ì¸ì¤í´ì¤ê° ê³µì íë ë³ì
'canine'
>>> d.name # d ë§ì ë³ì
'Fido'
>>> e.name # e ë§ì ë³ì
'Buddy'
As discussed in ì´ë¦ê³¼ ê°ì²´ì ê´í íë§ë, shared data can have possibly surprising effects involving mutable objects such as lists and dictionaries. For example, the tricks list in the following code should not be used as a class variable because just a single list would be shared by all Dog instances:
class Dog:
tricks = [] # í´ëì¤ ë³ìì ì못ë ì¬ì©
def __init__(self, name):
self.name = name
def add_trick(self, trick):
self.tricks.append(trick)
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks # ìê¸°ì¹ ìê² ëª¨ë ì¸ì¤í´ì¤ê° ê³µì í©ëë¤
['roll over', 'play dead']
ëì , í´ëì¤ì ì¬ë°ë¥¸ ì¤ê³ë ì¸ì¤í´ì¤ ë³ì를 ì¬ì©í´ì¼ í©ëë¤:
class Dog:
def __init__(self, name):
self.name = name
self.tricks = [] # ê° ì¸ì¤í´ì¤ë§ë¤ ì ë¹ ë¦¬ì¤í¸ë¥¼ ë§ëëë¤
def add_trick(self, trick):
self.tricks.append(trick)
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks
['roll over']
>>> e.tricks
['play dead']
9.4. 기í 주ìì¬íë¤Â¶
ì¸ì¤í´ì¤ì í´ëì¤ ëª¨ëìì ê°ì ì´í¸ë¦¬ë·°í¸ ì´ë¦ì´ ë±ì¥íë©´, ì´í¸ë¦¬ë·°í¸ ì¡°íë ì¸ì¤í´ì¤ë¥¼ ì°ì í©ëë¤:
>>> class Warehouse:
... purpose = 'storage'
... region = 'west'
...
>>> w1 = Warehouse()
>>> print(w1.purpose, w1.region)
storage west
>>> w2 = Warehouse()
>>> w2.region = 'east'
>>> print(w2.purpose, w2.region)
storage east
ë°ì´í° ì´í¸ë¦¬ë·°í¸ë ë©ìë ë¿ë§ ìëë¼ ê°ì²´ì ì¼ë°ì ì¸ ì¬ì©ì (âí´ë¼ì´ì¸í¸â)ì ìí´ì 참조ë ìë ììµëë¤. ë¬ë¦¬ íííë©´, í´ëì¤ë ììíê² ì¶ìì ì¸ ë°ì´í°íì 구ííëë° ì¬ì©ë ì ììµëë¤. ì¬ì¤, íì´ì¬ììë ë°ì´í° ìëì ê°ì í ë°©ë²ì´ ììµëë¤ â 모ë ê´ë¡ì ìì¡´í©ëë¤. (ë°ë©´ì, Cë¡ ìì±ë íì´ì¬ 구íì íìíë¤ë©´ 구í ìì¸ë¥¼ ìì í ì¨ê¸°ê³ ê°ì²´ì ëí ì¡ì¸ì¤ë¥¼ ì ì´í ì ììµëë¤; ì´ê²ì Cë¡ ìì±ë íì´ì¬ íì¥ìì ì¬ì©ë ì ììµëë¤.)
í´ë¼ì´ì¸í¸ë ë°ì´í° ì´í¸ë¦¬ë·°í¸ë¥¼ ì¡°ì¬ì¤ë½ê² ì¬ì©í´ì¼ í©ëë¤ â í´ë¼ì´ì¸í¸ë ë°ì´í° ì´í¸ë¦¬ë·°í¸ë¥¼ ê±´ëë ¤ì ë©ìëë¤ì ìí´ ì ì§ëë ë¶ë³ì± ë¤ì ë§ê°ë¨ë¦´ ì ììµëë¤. í´ë¼ì´ì¸í¸ë ì´ë¦ ì¶©ëì í¼íë í ë©ìëë¤ì ì í¨ì±ì ììíì§ ìê³ ë ê·¸ë¤ ìì ì ë°ì´í° ì´í¸ë¦¬ë·°í¸ë¥¼ ì¸ì¤í´ì¤ ê°ì²´ì ì¶ê°í ìë ììì ì ìíì¸ì â ë¤ì íë², ëª ëª ê·ì¹ì ì¬ë¬ 골칫거리를 í¼í ì ìê² í©ëë¤.
ë©ìë ììì ë°ì´í° ì´í¸ë¦¬ë·°í¸ë¤(ëë ë¤ë¥¸ ë©ìëë¤!)ì 참조íë ì¤ì ííì ììµëë¤. ì ë ì´ê²ì´ ì¤ì ë¡ ë©ìëì ê°ë ì±ì ëì¸ë¤ë ê²ì ìê² ëììµëë¤: ë©ìë를 íì´ë³¼ ë ì§ì ë³ìì ì¸ì¤í´ì¤ ë³ì를 í¼ëí ì°ë ¤ê° ììµëë¤.
ì¢
ì¢
, ë©ìëì 첫 ë²ì§¸ ì¸ìë self ë¼ê³ ë¶ë¦½ëë¤. ì´ê²ì ê´ë¡ì¼ ë¿ì
ëë¤: ì´ë¦ self ë íì´ì¬ìì ìë¬´ë° í¹ë³í ì미를 ê°ì§ ììµëë¤. íì§ë§, ì´ ê·ì¹ì ë°ë¥´ì§ ìì ë ì¬ë¬ë¶ì ì½ëê° ë¤ë¥¸ íì´ì¬ íë¡ê·¸ë머ë¤ì´ ì½ê¸°ì ë¶í¸íê³ , í´ëì¤ ë¸ë¼ì°ì íë¡ê·¸ë¨ë ì´ë° ê·ì¹ì ìì¡´íëë¡ ìì±ëìë¤ê³ ììí ì ììì ì ìíì¸ì.
í´ëì¤ ì´í¸ë¦¬ë·°í¸ì¸ 모ë í¨ìë ê·¸ í´ëì¤ì ì¸ì¤í´ì¤ë¤ì ìí ë©ìë를 ì ìí©ëë¤. í¨ì ì ìê° í´ëì¤ ì ìì í ì¤í¸ ì ì¼ë¡ ëë¬ì¸ì¼ íìë ììµëë¤: í¨ì ê°ì²´ë¥¼ í´ëì¤ì ì§ì ë³ìë¡ ëì íë ê² ìì ê°ë¥í©ëë¤. ì를 ë¤ì´:
# í´ëì¤ ì¸ë¶ìì ì ìë í¨ì
def f1(self, x, y):
return min(x, x+y)
class C:
f = f1
def g(self):
return 'hello world'
h = g
ì´ì f, g, h ë 모ë í¨ì ê°ì²´ë¥¼ ê°ë¦¬í¤ë í´ëì¤ C ì ì´í¸ë¦¬ë·°í¸ê³ , ê²°ê³¼ì ì¼ë¡ ì´ê²ë¤ì 모ë C ì ì¸ì¤í´ì¤ë¤ì ë©ìëì
ëë¤ â h ë ì íí g ì ëë±í©ëë¤. ì´ë° ë°©ìì íë¡ê·¸ë¨ì ë
ìë¤ìê² í¼ëì ì£¼ê¸°ë§ íë¤ë ì ì 주ìíì¸ì.
ë©ìëë self ì¸ìì ë©ìë ì´í¸ë¦¬ë·°í¸ë¥¼ ì¬ì©í´ì ë¤ë¥¸ ë©ìë를 í¸ì¶í ì ììµëë¤:
class Bag:
def __init__(self):
self.data = []
def add(self, x):
self.data.append(x)
def addtwice(self, x):
self.add(x)
self.add(x)
ë©ìëë ì¼ë° í¨ìë¤ê³¼ ë§ì°¬ê°ì§ë¡ ì ì ì´ë¦ì 참조í ì ììµëë¤. ë©ìëì ê²°í©í ì ì ì¤ì½íë ê·¸ê²ì ì ì를 í¬í¨íë 모ëì ëë¤. (í´ëì¤ë ê²°ì½ ì ì ì¤ì½íë¡ ì¬ì©ëì§ ììµëë¤.) ë©ìëìì ì ì ë°ì´í°ë¥¼ ì¬ì©í ì¢ì ì´ì 를 ê±°ì ë§ëì§ ëª»íì§ë§, ì ì ì¤ì½í를 ì ë¹íê² ì¬ì©íë ì¬ë¬ ê°ì§ ê²½ì°ê° ììµëë¤: íê°ì§ë, ì ì ì¤ì½íì ì ìë í¨ìì ë©ìë ë¿ë§ ìëë¼, 그곳ì ìí¬í¸ë í¨ìì 모ëë ë©ìëê° ì¬ì©í ì ìë¤ë ê²ì ëë¤. ë³´íµ, ë©ìë를 í¬í¨íë í´ëì¤ ìì ì ì´ ì ì ì¤ì½íì ì ìëê³ , ë¤ì ì¹ì ìì ë©ìëê° ìì ì í´ëì¤ë¥¼ 참조í길 ìíë ëª ê°ì§ ì¢ì ì´ì 를 ë³´ê² ë ê²ì ëë¤.
ê° ê°ì ê°ì²´ê³ , ê·¸ë¬ë¯ë¡ í´ëì¤ (í ì´ë¼ê³ ë ë¶ë¦°ë¤) 를 ê°ìµëë¤. ì´ê²ì object.__class__ ì ì ì¥ëì´ ììµëë¤.
9.5. ìì¶
ë¬¼ë¡ , ììì ì§ìíì§ ìëë¤ë©´ ì¸ì´ 기ë¥ì âí´ëì¤âë¼ë ì´ë¦ì ë¶ì¼ë§í ê°ì¹ê° ìì ê²ì ëë¤. íì í´ëì¤ ì ìì 문ë²ì ì´ë ê² ìê²¼ìµëë¤:
class DerivedClassName(BaseClassName):
<statement-1>
.
.
.
<statement-N>
ì´ë¦ BaseClassName ì íì í´ëì¤ ì ì를 í¬í¨íë ì¤ì½íìì ì ê·¼í ì ìë ì´ë¦ ê³µê°ì ì ìëì´ ìì´ì¼ í©ëë¤. ë² ì´ì¤ í´ëì¤ ì´ë¦ì ì리ì ë¤ë¥¸ ììì ííìë íë½ë©ëë¤. ì를 ë¤ì´, ë² ì´ì¤ í´ëì¤ê° ë¤ë¥¸ 모ëì ì ìëì´ ìì ë ì ì©í©ëë¤:
class DerivedClassName(modname.BaseClassName):
íì í´ëì¤ ì ìì ì¤íì ë² ì´ì¤ í´ëì¤ì ê°ì ë°©ìì¼ë¡ ì§íë©ëë¤. í´ëì¤ ê°ì²´ê° ë§ë¤ì´ì§ ë, ë² ì´ì¤ í´ëì¤ê° 기ìµë©ëë¤. ì´ê²ì ì´í¸ë¦¬ë·°í¸ 참조를 ê²°ì í ë ì¬ì©ë©ëë¤: ìì²ë ì´í¸ë¦¬ë·°í¸ê° í´ëì¤ìì ë°ê²¬ëì§ ìì¼ë©´ ë² ì´ì¤ í´ëì¤ë¡ ê²ìì íì¥í©ëë¤. ë² ì´ì¤ í´ëì¤ ëí ë¤ë¥¸ í´ëì¤ë¡ë¶í° íìëìë¤ë©´ ì´ ê·ì¹ì ì¬ê·ì ì¼ë¡ ì ì©ë©ëë¤.
íì í´ëì¤ì ì¸ì¤í´ì¤ ë§ë¤ê¸°ì í¹ë³í ê²ì ììµëë¤: DerivedClassName() ë ê·¸ í´ëì¤ì ì ì¸ì¤í´ì¤ë¥¼ ë§ëëë¤. ë©ìë 참조ë ë¤ìê³¼ ê°ì´ ê²°ì ë©ëë¤: ëìíë í´ëì¤ ì´í¸ë¦¬ë·°í¸ê° ê²ìëëë°, íìíë©´ ë² ì´ì¤ í´ëì¤ì ì°ì를 íê³ ë´ë ¤ê°ëë¤. ì´ê²ì´ í¨ì ê°ì²´ë¥¼ ì¤ë¤ë©´ ë©ìë 참조ë ì¬ë°ë¦
ëë¤.
íì í´ëì¤ë ë² ì´ì¤ í´ëì¤ì ë©ìëë¤ì ì¬ì ìí ì ììµëë¤. ë©ìëê° ê°ì ê°ì²´ì ë¤ë¥¸ ë©ìë를 í¸ì¶í ë í¹ë³í ê¶í ê°ì ê²ì ìì¼ë¯ë¡, ë² ì´ì¤ í´ëì¤ì ì ìë ë¤ë¥¸ ë©ìë를 í¸ì¶íë ë² ì´ì¤ í´ëì¤ì ë©ìëë ì¬ì ìë íì í´ëì¤ì ë©ìë를 í¸ì¶íê² ë©ëë¤. (C++ íë¡ê·¸ë머를 ìí ííì¼ë¡: íì´ì¬ì 모ë ë©ìëë ì¤ì§ì ì¼ë¡ virtual ì
ëë¤.)
íì í´ëì¤ìì ì¬ì ìë ë©ìëê°, ê°ì ì´ë¦ì ë² ì´ì¤ í´ëì¤ ë©ìë를 ë¨ìí ê°ìì¹ì°ê¸°ë³´ë¤ ì¬ì¤ì íì¥íê³ ì¶ì ì ììµëë¤. ë² ì´ì¤ í´ëì¤ì ë©ìë를 ì§ì í¸ì¶íë ê°ë¨í ë°©ë²ì´ ììµëë¤: ë¨ì§ BaseClassName.methodname(self, arguments) 를 í¸ì¶íë©´ ë©ëë¤. ì´ê²ì ëë¡ í´ë¼ì´ì¸í¸ìê²ë ì¸ëª¨ê° ììµëë¤. (ì´ê²ì ë² ì´ì¤ í´ëì¤ê° ì ì ì¤ì½íìì BaseClassName ì¼ë¡ ì¡ì¸ì¤ ë ì ìì ëë§ ëìí¨ì 주ìíì¸ì.)
íì´ì¬ìë ììê³¼ í¨ê» ì¬ì©í ì ìë ë ê°ì ë´ì¥ í¨ìê° ììµëë¤:
ì¸ì¤í´ì¤ì íì ê²ì¬íë ¤ë©´
isinstance()를 ì¬ì©í©ëë¤:isinstance(obj, int)ëobj.__class__ê°intê±°ëintìì íìë í´ëì¤ì¸ ê²½ì°ë§Trueê° ë©ëë¤.í´ëì¤ ììì ê²ì¬íë ¤ë©´
issubclass()를 ì¬ì©í©ëë¤:issubclass(bool, int)ëTrueì¸ë°,boolì´intì ìë¸ í´ëì¤ì´ê¸° ë문ì ëë¤. íì§ë§,issubclass(float, int)ëFalseì¸ë°,floatëintì ìë¸ í´ëì¤ê° ìë기 ë문ì ëë¤.
9.5.1. ë¤ì¤ ìì¶
íì´ì¬ì ë¤ì¤ ììì ííë ì§ìí©ëë¤. ì¬ë¬ ê°ì ë² ì´ì¤ í´ëì¤ë¥¼ ê°ë í´ëì¤ ì ìë ì´ë° ìì ëë¤:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
ëë¶ë¶ì 목ì ì, ê°ì¥ ê°ë¨í ê²½ì°ì, ë¶ëª¨ í´ëì¤ë¡ë¶í° ììë ì´í¸ë¦¬ë·°í¸ë¤ì ê²ìì ê¹ì´ ì°ì ì¼ë¡, ì¼ìª½ìì ì¤ë¥¸ìª½ì¼ë¡, ê³ì¸µ 구조ìì ê²¹ì¹ë ê°ì í´ëì¤ë¥¼ ë ë² ê²ìíì§ ìë ê²ì¼ë¡ ìê°í ì ììµëë¤. ê·¸ëì, ì´í¸ë¦¬ë·°í¸ê° DerivedClassName ìì ë°ê²¬ëì§ ìì¼ë©´, Base1 ìì ì°¾ê³ , ê·¸ë¤ì (ì¬ê·ì ì¼ë¡) Base1 ì ë² ì´ì¤ í´ëì¤ë¤ì ê²ìí©ëë¤. 거기ììë ë°ê²¬ëì§ ìì¼ë©´, Base2 ìì ì°¾ê³ , ì´ë° ìì¼ë¡ ê³ìí©ëë¤.
ì¬ì¤, ì´ê²ë³´ë¤ë ì½ê° ë ë³µì¡í©ëë¤; ë©ìë ê²°ì ììë super() ë¡ì íë ¥ì ì¸ í¸ì¶ì ì§ìí기 ìí´ ëì ì¼ë¡ ë³ê²½ë©ëë¤. ì´ ì ê·¼ë²ì ëªëª ë¤ë¥¸ ë¤ì¤ ìì ì¸ì´ë¤ìì call-next-method ë¼ê³ ìë ¤ì ¸ ìê³ , ë¨ì¼ ìì ì¸ì´ë¤ìì ë°ê²¬ëë super í¸ì¶ë³´ë¤ ë ê°ë ¥í©ëë¤.
ëì ì¸ ììê° íìí ì´ì ë, 모ë ë¤ì¤ ììì ê²½ì°ë íëë ê·¸ ì´ìì ë¤ì´ì몬ë ê´ê³ (ì ì´ë ë¶ëª¨ í´ëì¤ ì¤ íëê° ê°ì¥ ë°ë¥ í´ëì¤ë¤ë¡ë¶í° ì¬ë¬ ê²½ë¡ë¥¼ íµí´ ì¡ì¸ì¤ ëë ê²½ì°) 를 ë§ë¤ê¸° ë문ì
ëë¤. ì를 ë¤ì´, 모ë í´ëì¤ë object 를 ê³ì¹í기 ë문ì, 모ë ë¤ì¤ ììì object ì ì´ë¥´ë ì¬ë¬ ê²½ë¡ë¥¼ ì ê³µí©ëë¤. ë² ì´ì¤ í´ëì¤ë¤ì´ ì¬ë¬ ë² ì¡ì¸ì¤ ëì§ ìê² íë ¤ê³ , ëì ì¸ ìê³ ë¦¬ì¦ì´ ê²ì ìì를 ì íííëë°, ê° í´ëì¤ìì ì§ì ë ì¼ìª½ìì ì¤ë¥¸ìª½ì¼ë¡ ê°ë ìì를 ë³´ì¡´íê³ , ê° ë¶ëª¨ë¥¼ ì¤ì§ í ë²ë§ í¸ì¶íê³ , ë¨ì¡°ì (ë¶ëª¨ë¤ì ì°ì ììì ìí¥ì ì£¼ì§ ìì¼ë©´ì ìë¸ í´ëì¤ë¥¼ ë§ë¤ ì ìë¤ë ì미ì
ëë¤) ì´ëë¡ ë§ëëë¤. 모ë í¨ê» ì¬ì©ë ë, ì´ ì±ì§ë¤ì ë¤ì¤ ììì¼ë¡ ì ë¢°ì± ìê³ íì¥ì± ìë í´ëì¤ë¤ì ì¤ê³í ì ìëë¡ ë§ëëë¤. ë ìì¸í ë´ì©ì, The Python 2.3 Method Resolution Order를 ë³´ì¸ì.
9.6. ë¹ê³µê° ë³ì¶
ê°ì²´ ë´ë¶ììë§ ì¡ì¸ì¤í ì ìë âë¹ê³µê°â ì¸ì¤í´ì¤ ë³ìë íì´ì¬ì ì¡´ì¬íì§ ììµëë¤. íì§ë§, ëë¶ë¶ì íì´ì¬ ì½ëìì ë°ë¥´ê³ ìë ê·ì½ì´ ììµëë¤: ë°ì¤ë¡ ììíë ì´ë¦ì (ì를 ë¤ì´, _spam) APIì ê³µê°ì ì´ì§ ìì ë¶ë¶ì¼ë¡ ì·¨ê¸ëì´ì¼ í©ëë¤ (ê·¸ê²ì´ í¨ì, ë©ìë, ë°ì´í° 멤ë²ì¤ 무ìì´ê±´ ê°ì). 구í ìì¸ì´ê³ íµë³´ ìì´ ë³ê²½ëë ëìì¼ë¡ ì·¨ê¸ëì´ì¼ í©ëë¤.
í´ëì¤-ë¹ê³µê° 멤ë²ë¤ì ì¬ë°ë¥¸ ì¬ë¡ê° ìì¼ë¯ë¡ (ì¦ ìë¸ í´ëì¤ìì ì ìë ì´ë¦ë¤ê³¼ì ì¶©ëì í¼íê³ ì), ì´ë¦ ë¤ì기 (name mangling) ë¼ê³ ë¶ë¦¬ë ë©ì»¤ëì¦ì ëí ì íë ì§ìì´ ììµëë¤. __spam ííì (ìµì ë ê°ì ë°ì¤ë¡ ììíê³ , ìµë í ê°ì ë°ì¤ë¡ ëë©ëë¤) 모ë ìë³ìë _classname__spam ë¡ í
ì¤í¸ ì ì¼ë¡ ì¹íëëë°, classname ì íì¬ í´ëì¤ ì´ë¦ìì ìì ì¤ë ë°ì¤ì ì ê±°í ê²ì
ëë¤. ì´ ë¤ì기ë í´ëì¤ ì ìì ë±ì¥íë ì´ì, ìë³ìì 문ë²ì ìì¹ì 무ê´íê² ìíë©ëë¤.
ë 보기
ìì¸í ë´ì©ê³¼ í¹ìí ì¬ë¡ë ë¹ê³µê° ì´ë¦ ë¤ì기 ëª ì¸ë¥¼ 참조íì¸ì.
ì´ë¦ ë¤ì기ë í´ëì¤ ë´ë¶ì ë©ìë í¸ì¶ì ë°©í´íì§ ìê³ ìë¸ í´ëì¤ë¤ì´ ë©ìë를 ì¬ì ìí ì ìëë¡ íë ë° ëìì ì¤ëë¤. ì를 ë¤ì´:
class Mapping:
def __init__(self, iterable):
self.items_list = []
self.__update(iterable)
def update(self, iterable):
for item in iterable:
self.items_list.append(item)
__update = update # 기존 update() ë©ìëì ë¹ê³µê° ì¬ë³¸
class MappingSubclass(Mapping):
def update(self, keys, values):
# update() ì ìë¡ì´ ìëª
ì ì ê³µíì§ë§
# __init__() 를 ë§ê°ë¨ë¦¬ì§ ììµëë¤
for item in zip(keys, values):
self.items_list.append(item)
ìì ìë MappingSubclassê° __update ìë³ì를 ëì
íëë¼ë ìëí©ëë¤. Mapping í´ëì¤ììë _Mapping__updateë¡ MappingSubclass í´ëì¤ììë _MappingSubclass__updateë¡ ê°ê° ëì²´ ë기 ë문ì
ëë¤.
ë¤ì기 ê·ì¹ì ëì²´ë¡ ì¬ê³ 를 í¼íê³ ì ì¤ê³ëìë¤ë ê²ì 주ìíì¸ì; ì¬ì í ë¹ê³µê°ë¡ ì·¨ê¸ëë ë³ìë¤ì ì¡ì¸ì¤íê±°ë ìì í ì ììµëë¤. ì´ê²ì ëë²ê±°ì ê°ì í¹ë³í ìí©ìì ì¸ëª¨ ì기조차 í©ëë¤.
exec() ë eval() ë¡ ì ë¬ë ì½ëë í¸ì¶íë í´ëì¤ì í´ëì¤ ì´ë¦ì íì¬ í´ëì¤ë¡ ì¬ê¸°ì§ ìëë¤ë ê²ì 주ìíì¸ì; ì´ê²ì global 문ì í¨ê³¼ì ì ì¬íë°, í¨ê³¼ê° í¨ê» ë°ì´í¸-ì»´íì¼ë ì½ëë¡ ì íë©ëë¤. ê°ì ì ì½ì´ __dict__ 를 ì§ì 참조í ëë¿ë§ ìëë¼, getattr(), setattr(), delattr() ìë ì ì©ë©ëë¤.
9.7. ì¡ëì¬ë¶
ëë¡ ëªëª ì´ë¦ ë¶ì ë°ì´í° í목ë¤ì í¨ê» 묶ì´ì£¼ë íì¤ì¹¼ì ârecordâ ë Cì âstructâ ì ì ì¬í ë°ì´í°íì ê°ë ê²ì´ ì¸ëª¨ ììµëë¤. ì´ ê²½ì° dataclasses를 ì¬ì©íë ê²ì´ ì¼ë°ì ì¸ ë°©ë²ì
ëë¤:
from dataclasses import dataclass
@dataclass
class Employee:
name: str
dept: str
salary: int
>>> john = Employee('john', 'computer lab', 1000)
>>> john.dept
'computer lab'
>>> john.salary
1000
í¹ì í ì¶ìì ì¸ ë°ì´í°íì 기ëíë íì´ì¬ ì½ë ì¡°ê°ì, ì¢
ì¢
ê·¸ ë°ì´í°íì ë©ìë를 íë´ ë´ë í´ëì¤ë¥¼ ëì ì ë¬ë°ì ì ììµëë¤. ì를 ë¤ì´, íì¼ ê°ì²´ë¡ë¶í° ë°ì´í°ë¥¼ í¬ë§·íë í¨ìê° ìì ë, ëì 문ìì´ ë²í¼ìì ë°ì´í°ë¥¼ ì½ë ë©ìë read() ì readline() ì ì ê³µíë í´ëì¤ë¥¼ ì ìí í ì¸ìë¡ ì ë¬í ì ììµëë¤.
ì¸ì¤í´ì¤ ë©ìë ê°ì²´ë ì´í¸ë¦¬ë·°í¸ë¥¼ ê°ìµëë¤: m.__self__ ë ë©ìë m() ê³¼ ê²°í©í ì¸ì¤í´ì¤ ê°ì²´ì´ê³ , m.__func__ ë ë©ìëì ììíë í¨ì ê°ì²´ì
ëë¤.
9.8. ì´í°ë ì´í°Â¶
ì§ê¸ì¯¤ ìë§ë ì¬ë¬ë¶ì ëë¶ë¶ì 컨í
ì´ë ê°ì²´ë¤ì for 문ì¼ë¡ 루íí ì ììì ëì¹ì±ì ê²ì
ëë¤:
for element in [1, 2, 3]:
print(element)
for element in (1, 2, 3):
print(element)
for key in {'one':1, 'two':2}:
print(key)
for char in "123":
print(char)
for line in open("myfile.txt"):
print(line, end='')
ì´ë° ì¤íì¼ì ì¡ì¸ì¤ë ëª
ë£íê³ , ê°ê²°íê³ , í¸ë¦¬í©ëë¤. ì´í°ë ì´í°ë¥¼ ì¬ì©íë©´ íì´ì¬ì´ ë³´í¸ííê³ íµí©ë©ëë¤. 무ë ë¤ìì, for 문ì 컨í
ì´ë ê°ì²´ì ëí´ iter() 를 í¸ì¶í©ëë¤. ì´ í¨ìë ë©ìë __next__() 를 ì ìíë ì´í°ë ì´í° ê°ì²´ë¥¼ ëë ¤ì£¼ëë°, ì´ ë©ìëë 컨í
ì´ëì ììë¤ì í ë²ì íëì© ì¡ì¸ì¤í©ëë¤. ë¨ì ììê° ìì¼ë©´, __next__() ë StopIteration ìì¸ë¥¼ ì¼ì¼ì¼ì for 루íì ì¢
ë£ë¥¼ ì립ëë¤. next() ë´ì¥ í¨ì를 ì¬ì©í´ì __next__() ë©ìë를 í¸ì¶í ì ììµëë¤; ì´ ìë ì´ ëª¨ë ê²ë¤ì´ ì´ë»ê² ëìíëì§ ë³´ì¬ì¤ëë¤:
>>> s = 'abc'
>>> it = iter(s)
>>> it
<str_iterator object at 0x10c90e650>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
next(it)
StopIteration
ì´í°ë ì´í° íë¡í ì½ì ë¤ì ìë ë©ì»¤ëì¦ì ì´í´ë³´ë©´, ì¬ë¬ë¶ì í´ëì¤ì ì´í°ë ì´í° ëìì ì½ê² ì¶ê°í ì ììµëë¤. __next__() ë©ìë를 ê°ì§ ê°ì²´ë¥¼ ëë ¤ì£¼ë __iter__() ë©ìë를 ì ìí©ëë¤. í´ëì¤ê° __next__() 를 ì ìíë©´, __iter__() ë ê·¸ë¥ self 를 ëë ¤ì¤ ì ììµëë¤.
class Reverse:
"""ìíì¤ë¥¼ ììì¼ë¡ ì´í°ë ì´í¸íë ì´í°ë ì´í°."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
... print(char)
...
m
a
p
s
9.9. ì ëë ì´í°Â¶
ì ëë ì´í° ë ì´í°ë ì´í°ë¥¼ ë§ëë ê°ë¨íê³ ê°ë ¥í ë구ì
ëë¤. ì¼ë°ì ì¸ í¨ìì²ë¼ ìì±ëì§ë§ ê°ì ëë ¤ì£¼ê³ ì¶ì ëë§ë¤ yield 문ì ì¬ì©í©ëë¤. ì ëë ì´í°ì next() ê° í¸ì¶ë ëë§ë¤, ì ëë ì´í°ë ë ë ê³³ìì ì¤íì ì¬ê°í©ëë¤ (모ë ë°ì´í° ê°ë¤ê³¼ ì´ë¤ 문ì¥ì´ ë§ì§ë§ì¼ë¡ ì¤íëìëì§ ê¸°ìµí©ëë¤). ìë ì ëë ì´í°ë¥¼ ì¬ìí ì ëë¡ ì½ê² ë§ë¤ ì ììì ë³´ì¬ì¤ëë¤:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
>>> for char in reverse('golf'):
... print(char)
...
f
l
o
g
ì ëë ì´í°ë¡ í ì ìë 모ë ê²ì ì ì ìì ì¤ëª
íë¯ì´ í´ëì¤ ê¸°ë° ì´í°ë ì´í°ë¡ë í ì ììµëë¤. ì ëë ì´í°ê° ê°ë¨í ì´ì ë __iter__() ì __next__() ë©ìëê° ì ì ë¡ ë§ë¤ì´ì§ê¸° ë문ì
ëë¤.
ë íëì 주ì 기ë¥ì ì§ì ë³ìë¤ê³¼ ì¤í ìíê° í¸ì¶ ê°ì ìëì¼ë¡ ë³´ê´ëë¤ë ê²ì
ëë¤. ì´ê²ì self.index ë self.data ì ê°ì ì¸ì¤í´ì¤ ë³ì를 ì¬ì©íë ì ê·¼ë²ì ë¹êµí´ í¨ì를 ì°ê¸° ì½ê³ ëª
ë£íê² ë§ëëë¤.
ìë ë©ìë ìì±ê³¼ íë¡ê·¸ë¨ ìíì ì ì¥ì ëí´, ì ëë ì´í°ê° ì¢
ë£í ë ìëì¼ë¡ StopIteration ì ì¼ì¼íµëë¤. ì¡°í©íë©´, ì´ ê¸°ë¥ë¤ì´ ì¼ë° í¨ì를 ìì±íë ê²ë§í¼ ì´í°ë ì´í°ë¥¼ ë§ë¤ê¸° ì½ê² ë§ëëë¤.
9.10. ì ëë ì´í° ííì¶
ê°ë¨í ì ëë ì´í°ë 리ì¤í¸ ì»´í리í¨ì ê³¼ ë¹ì·íì§ë§, ëê´í¸ ëì ê´í¸ë¥¼ ì¬ì©íë 문ë²ì ì¬ì©í ííìì¼ë¡ ê°ê²°íê² ì½ë©í ì ììµëë¤. ì´ ííìë¤ì ëë¬ì¸ë í¨ìê° ì ëë ì´í°ë¥¼ ì¦ì ì¬ì©íë ìí©ì ìí´ ì¤ê³ëììµëë¤. ì ëë ì´í° ííìì ìì í ì ëë ì´í° ì ìë³´ë¤ ê°ê²°íì§ë§, ìµíµì±ì ë¨ì´ì§ê³ , ë¹ì·í 리ì¤í¸ ì»´í리í¨ì ë³´ë¤ ë©ëª¨ë¦¬ë¥¼ ë ì°ë ê²½í¥ì´ ììµëë¤.
ì:
>>> sum(i*i for i in range(10)) # ì ê³±ì í©
285
>>> xvec = [10, 20, 30]
>>> yvec = [7, 5, 3]
>>> sum(x*y for x,y in zip(xvec, yvec)) # ë´ì
260
>>> unique_words = set(word for line in page for word in line.split())
>>> valedictorian = max((student.gpa, student.name) for student in graduates)
>>> data = 'golf'
>>> list(data[i] for i in range(len(data)-1, -1, -1))
['f', 'l', 'o', 'g']
ê°ì£¼