클래스와 모듈의 공통점과 차이점에 대해 설명하시오.
다형성에 대해 설명하고 다형성을 보여주는 자신만의 파이썬 코드 예제를 제시하시오.
다음 각 요구사항 모두를 만족시키는 Counter 클래스를 코딩하시오 (정답을 각 요구사항별로 입력할 필요 없이 3번 문제에 대해 1개의 클래스 정의 코드를 제시하면 된다.)
요구사항 1. 생성자에 count 값과 step 값을 인자로 받을 수 있다.
>>> c = Counter(10)
>>> d = Counter(10, 2)
요구사항 2. 다음과 같이 Counter의 인스턴스를 출력을 해주는 __str__() 메소드를 Counter 클래스 내에 구현하시오.
>>> print(c)
[Count (step: 1)] 10
>>> print(d)
[Count (step: 2)] 10
요구사항 3. 다음과 같이 step에 주어진 증분만큼 count를 증가시키는 incr() 메소드를 Counter 클래스 내에 구현하시오.
>>> c.incr()
>>> d.incr()
>>> print(c)
[Count (step: 1)] 11
>>> print(d)
[Count (step: 2)] 12
요구사항 4. Counter 클래스 내에 관련 메소드를 추가하여 인스턴스 객체를 직접 호출(call)할 수 있도록 하시오. 인스턴스 객체를 직접 호출했을 때에 내부적으로 incr() 메소드를 호출하는 방법으로 구현하시오.
>>> c()
>>> d()
>>> print(c)
[Count (step: 1)] 12
>>> print(d)
[Count (step: 2)] 14
요구사항 5. 다음과 같은 두 개의 산술 연산 (+, -)이 수행될 수 있도록 Counter 클래스 내에 관련 메소드를 추가하시오.
>>> c = c + 5
>>> d = d - 5
>>> print(c)
[Count (step: 1)] 17
>>> print(d)
[Count (step: 2)] 9
요구사항 6. 다음과 같은 관계연산 (>, <, ==)이 수행될 수 있도록 Counter 클래스 내에 관련 메소드를 추가하시오.
>>> print(c) > 10
True
>>> print(d) > 10
False
>>> print(c) < 10
False
>>> print(d) < 10
True
>>> print(c) == 17
True
>>> print(d) != 9
False
다음은 내장 자료형 list를 서브클래싱하여 만든 MySet 클래스 정의 내용이다. 다음 클래스 정의에서 __init__(), __str()__(), elimicate_duplicate()의 세 개의 메소드 코드 내용을 자신이 다른 사람에게 가르친다고 생각하며 설명해보시오.
class MySet(list):
def __init__(self, l):
for e in l:
self.append(e)
MySet.eliminate_duplicate(self)
def __str__(self):
result = "MySet: {"
for e in self:
result = result + str(e) + " ,"
result = result[0:len(result)-2] + "}"
return result
@staticmethod
def eliminate_duplicate(l):
s = []
for e in l:
if e not in s:
s.append(e)
l[:] = []
for e in s:
l.append(e)
if __name__ == "__main__":
s = MySet([1, 2, 2, 3])
print(s)
t = MySet([2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9])
print(t)
4번 문제에 정의된 MySet 클래스에 메소드를 추가하여 다음 각 요구사항 모두를 만족시키는 코딩을 제시하시오
요구사항 1. | 연산으로 두 집합의 합집합을 반환한다.
>>> u = s | t
>>> print(u)
MySet: {1, 2, 3, 4, 5, 6, 7, 8, 9}
요구사항 2. & 연산으로 두 집합의 교집합을 반환한다.
>>> u = s & t
>>> print(u)
MySet: {2, 3}
요구사항 3. - 연산으로 두 집합의 차집합을 반환한다.
>>> s = MySet([1, 2, 3])
>>> t = MySet([3, 4, 5])
>>> u = s - t
>>> print(u)
MySet: {1, 2}
5번 문제에서 정의한 MySet 클래스에 대해 다음 예제를 수행하면 오류없이 올바르게 동작하는 것을 확인할 수 있다. 다음 예제 내에 있는 len(), bool() 내장함수와 in 키워드 사용 예제가 별다른 메소드 정의를 하지 않았는 데도 올바르게 수행되는 이유를 설명하시오.
>>> s = MySet([1, 2, 3, 4, 5, 6])
>>> print(len(s))
> 6
>>> print(bool(s))
> True
>>> print(2 in s)
> True
이전 Assignment 3 & Assignment 4를 다시 확장/변형하여 다음과 같은 조건을 만족하도록 구현하시오 (CODE REFACTORING!!!).
1) 새로운 클래스 SearchEngine를 정의하시오.
이전 숙제에서 고려했던 pickle 모듈 등은 전혀 고려하지 마시오.
이전 숙제에서 적용했던 국어/영어 불용어 처리는 적용하시오.
>>> w1 = SearchEngine('http://www.cnn.com', 'http://www.times.com', 'https://www.amazon.com')
>>> w2 = SearchEngine('http://www.cnn.com', 'http://www.times.com')
>>> w3 = SearchEngine()
3) addUrl() 메소드를 구현하여 인스턴스를 생성한 이후에도 URL을 추가할 수 있도록 한다.
>>> w1.addUrl('https://github.com')
>>> w3.addUrl('http://stackoverflow.com')
4) removeUrl() 메소드를 구현하여 URL을 삭제할 수 있도록 한다.
>>> w1.removeUrl('http://www.cnn.com')
>>> w2.removeUrl('http://stackoverflow.com')
>>> w1.listUrls()
http://www.times.com
https://www.amazon.com
https://github.com
6) getWordsFrequency() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전을 반환하시오.
>>> w1.getWordsFrequency()
{'hello': 8, 'site': 12, 'world': 2, 'science': 11, 'program': 1, 'python': 1}
7) getMaxFreqencyWords() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전에서 가장 많이 출현한 단어 리스트를 반환하시오.
>>> w1.getMaxFreqencyWords()
{'site': 12}
>>> w2.getMaxFreqencyWords()
{'site': 12, 'science': 12}
8) 임의의 단어 1개를 파라미터로 받는 searchUrlByWord() 메소드를 구현하여 유사도가 높은 웹 사이트를 출력하시오.
>>> w1.searchUrlByWord("news")
http://www.cnn.com
위 7번 문제에서 정의한 SearchEngine 클래스를 상속하여 SearchEngineWithOrderedWebWords 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.
getWordFrequence() 메소드에 reverse 라는 인자를 만들고 true 또는 false를 인자로 받을 수 있도록 한다.
>>> w4 = SearchEngineWithOrderedWebWords('http://www.times.com', 'https://www.amazon.com', 'https://github.com')
>>> w4.getWordsFrequency()
[('site', 12), ('science', 11), ('hello', 8), ('world', 2), ('program', 1), ('python', 1)]>>> w4.getWordsFrequency(reverse=true)
[('program', 1), ('python', 1), ('world', 2), ('hello', 8), ('science', 11), ('site', 12)]
다음과 같은 코딩이 가능하도록 SearchEngineWithOrderedWebWords안에 반복자와 관련된 메소드를 추가하시오.
>>> for i in w4:
>>> print(i)
('site, 12)
('science', 11)
('hello', 8)
('world', 2)
('program', 1)
('python', 1)