파이썬3 바이블 - 제13장 연습문제

프리렉 - FREELEC

http://freelec.co.kr/book/catalogue_view.asp?UID=134

이강성저

1.

  1. 변수와 그것을 조작하는 관련 함수를 하나의 공간으로 묶어서 단위로 구성하기 때문에 (새로운 자료형과 같은) 포장된 하나의 단위를 만드는 것과 같다.
  2. 데이터를 조작할 수 있는 적절한 인터페이스를 제공하여 사용자에게 편의성을 제공할 수 있다(encapsulation).
  3. 인스턴스 객체들은 별도의 이름공간을 가지게 되므로 독립적인 공간에서 작업이 가능하다.
  4. 클래스 객체들은 인스턴스 객체들이 공유하는 이름공간을 제공하므로 인스턴스 객체들의 자료 공유가 가능하다.
  5. 클래스 상속을 이용하면 약간의 변형을 필요로 하는 새로운 클래스를 쉽게 작성할 수 있다.
  6. 연산자 중복을 이용하면 내장 자료형과 같은 모든 편리한 연산을 구현할 수 있다.

2.

  1. 모듈은 한번 가져오기(import)되면 다른 모듈과 공유므로 단 한 개만의 이름 공간을 갖는다.
  2. 클래스는 인스턴스 생성을 통하여 얼마든지 많은 이름공간을 갖는 객체를 가질 수 있다.
  3. 클래스와 인스턴스들은 계층적인 관계를 맺고 있으며 이름 공간들은 수직으로 공유된다.
  4. 모듈은 단 한 개의 클래스 인스턴스와 유사하다.

3.

책 391-392 참조

4.

책 13.4.1 참조

5.

책 13.3.1 참조

6.

In [1]:
class B:
    b = 2
    
class C(B):
    a = 1
    def f(self):
        self.a = 5
In [2]:
c1 = C()
c2 = C()
c1.f()

가)

In [3]:
c1.a
Out[3]:
5
In [4]:
c2.a
Out[4]:
1

나)

이름 공간은 다음과 같이 연결되어 있다.

object - B - C -  c1
               +- c2

다)

c1.a를 통하여 우선 c1 이름공간에 a가 있는지 살핀다. c1에 없다면 클래스 C 이름 공간에서 a를 찾는다(발견된다). 만일 여기서도 찾지 못하면 B 에서 a를 찾는다. B에서도 못 찾으면 object에서 찾는다. 그래도 없으면 NameError 발생한다.

7.

In [5]:
import time

class LifeSpan:
    def __init__(self):   # 생성자
        self._start_time = time.time()
    def __del__(self):    # 소멸자
        print(time.time() - self._start_time)
In [6]:
life = LifeSpan()
time.sleep(2)
del life
2.002277135848999

8.

In [7]:
from math import *

class Turtle:
    
    def __init__(self):
        self.x = 0.0
        self.y = 0.0
        self.heading = 0.0
    
    def turn(self, angle):
        self.heading = (self.heading + angle) % 360
    
    def forward(self, distance):
        rad = radians(self.heading)
        dx = distance * cos(rad)
        dy = distance * sin(rad)
        self.x += dx
        self.y += dy
        
    def pos(self):
        return self.x, self.y
In [8]:
def almostEqual(a, b):
    return abs(a-b) < 1e-7

def almostEqual2(a, b):
    return abs(a[0]-b[0]) < 1e-7 and abs(a[1]-b[1]) < 1e-7

t = Turtle()

t.forward(100)
assert almostEqual2(t.pos(), (100, 0))

t.turn(90)
t.forward(100)
assert almostEqual2(t.pos(), (100, 100))

t.turn(90)
t.forward(100)
assert almostEqual2(t.pos(), (0, 100))

t.turn(90)
t.forward(100)
assert almostEqual2(t.pos(), (0, 0))

t = Turtle()
t.turn(45)
t.forward(100)
assert almostEqual2(t.pos(), (100/sqrt(2), 100/sqrt(2)))
In [8]: