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

프리렉 - FREELEC

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

이강성저

1.

In [1]:
class OrderedList(list):

    def __init__(self, data=(), key=None):
        super().__init__(data)
        self.key = key
        self.sort(key=self.key)

    def append(self, data):
        super().append(data)
        self.sort(key=self.key)
        
    def extend(self, data):
        super().extend(data)
        self.sort(key=self.key)
        
        
L = OrderedList((3, 10, 2))
print (L)
L.append(5)
print (L)
L.extend( (4,8,20) )
print (L)
[2, 3, 10]
[2, 3, 5, 10]
[2, 3, 4, 5, 8, 10, 20]

2.

C++, C#

두 언어 모두 메서드는 정적으로 처리된다. 만일 가상함수화 하고 싶으면 다음과 같이 virtual 키워드를 사용해야 한다.

public virtual double Area() 
{
    return x * y;
}

Java

자바에 있어서 모든 비정적인(non-static) 메서드는 모두 '가상 함수'이다. finale 키워드가 붙은 메서드와 상속되지 않는 private 메서드는 비-가상함수이다.

다른 언어는 스스로 검색을 해보기 바란다.

3.

super()는 베이스 클래스를 명시적으로 참조하는 것을 피하게 해준다. 하지만 진정한 장점은 다중 상속일 때 발생한다. 자동으로 베이스 클래스를 결정해주는 super의 기능이 다이아몬드 형 다중 상속일 때 발생하는 문제를 해결해준다. 책 474-477 참조.

4.

In [2]:
class Stack:
    def __init__(self, data):
        self.data = list(data)
    def __getattr__(self, name):
        if name in ('pop',):
            return getattr(self.data, name)
        raise NameError("'{}' not defined".format(name))
    def __repr__(self):
        return repr(self.data)
    def push(self, d):
        self.data.append(d)

s = Stack((1,2,3))
s.push(5)
s.push(6)
s.push(7)
print(s)
print (s.pop())
print (s.pop())
print(s)
s.append(4)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-02a524113d68> in <module>()
     19 print (s.pop())
     20 print(s)
---> 21 s.append(4)

<ipython-input-2-02a524113d68> in __getattr__(self, name)
      5         if name in ('pop',):
      6             return getattr(self.data, name)
----> 7         raise NameError("'{}' not defined".format(name))
      8     def __repr__(self):
      9         return repr(self.data)

NameError: 'append' not defined
[1, 2, 3, 5, 6, 7]
7
6
[1, 2, 3, 5]

In []: