Friday, July 13, 2018

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第16回

 MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第16回
オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年10月30日(木曜日) ― 第9週・2回目


担当教授:Prof. Grimson


全講義数:24コマ
各講義時間:60分


配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
ジャンル: クラス定義、カプセル化、インヘリタンス

ビデオ画像品質5段階評価:4
(解像度が480pあり、コンピュータ画面に表示されたソースコードを比較的はっきりと読み取ることができます。)
ビデオ音声品質5段階評価:3.5 グリムソン教授の発声、とてもめりはりがついているため、YoutubeのCC機能(キャプションソフトウエア機能)をオンにしてサブタイトルを表示すると、ほぼ正確に話した言葉が表示されています。・・・が、今回の収録は後半雑音が入り聞き取れなくなっている箇所があります。



講義コメント:
第16回目の講義は、前回3コマの講義で学習したオブジェクト指向プログラミングのまとめとなっています。
僅か4回の講義で(つまり4時間少々で)オブジェクト指向プログラミングの基礎をカバーしているわけで、正直オブジェクト指向プログラミングに関すjるエッセンスがいっぱい詰まった講義となっています。

特に前回と今回の講義で取り上げているPythonで書かれたサンプルプログラム、一見単純に見えますが、オブジェクト指向プログラミングの基礎エッセンスが盛り込まれていて、
とっても使える例題となっています。
ためになった講義内容の抜粋:
その1. 属性や入力した値を継承することができる。クラス図の上下関係を辿って、メソッドも継承することができ、またそのメソッドを上書きすることもできる。それらすべてをクラスのハイアラキーで実装することができる。
その2. 内在する数多くのユニットがそれぞれに特有な形でインタラクティブするようなシステムをモデルする場合に、オブジェクト指向のシステムは大変有効である。
その3. 自然な形でユニットをまとめることができて、ユニット間のインタラクティブが非常に制御されているようなシステムをモデルするべきである。



-------------------------------------------------

Lecture 16 Hand out 補助教材 ダウンロード

Lecture 16 ホームワーク ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------


-------------------------------------------------
講義で取り上げたPythonコードの例
例-1


class Person(object):
    def __init__(self, family_name, first_name):
        self.family_name = family_name
        self.first_name = first_name
    def familyName(self):
        return self.family_name
    def firstName(self):
        return self.first_name
    def __cmp__(self, other):
        return cmp((self.family_name, self.first_name),
                   (other.family_name, other.first_name))
    def __str__(self):
        return '<Person: %s %s>'%(self.first_name, self.family_name)
    def say(self,toWhom,something):
        return self.first_name + ' ' + self.family_name + ' says to ' + toWhom.firstName() + ' ' + toWhom.familyName() + ': ' + something
    def sing(self,toWhom,something):
        return self.say(toWhom,something + ' tra la la')

class MITPerson(Person):
    nextIdNum = 0
    def __init__(self, familyName, firstName):
        Person.__init__(self, familyName, firstName)
        self.idNum = MITPerson.nextIdNum
        MITPerson.nextIdNum += 1
    def getIdNum(self):
        return self.idNum
    def __str__(self):
        return '<MIT Person: %s %s>'%(self.first_name, self.family_name)
    def __cmp__(self,other):
        return cmp(self.idNum, other.idNum)

##p1 = MITPerson('Smith','Fred')
##p2 = MITPerson('Foobar','Jane')
##print p1.getIdNum()
##print p2.getIdNum()

class UG(MITPerson):
    def __init__(self, familyName, firstName):
        MITPerson.__init__(self, familyName, firstName)
        self.year = None
    def setYear(self, year):
        if year > 5: raise OverflowError('Too many')
        self.year = year
    def getYear(self):
        return self.year
    def say(self,toWhom,something):
        return MITPerson.say(self,toWhom,'Excuse me, but ' + something)
##
##me = Person("Grimson", "Eric")
##ug = UG('Doe', 'Jane')

class Prof(MITPerson):
    def __init__(self, familyName, firstName, rank):
        MITPerson.__init__(self, familyName, firstName)
        self.rank = rank
        self.teaching = {}
    def addTeaching(self, term, subj):
        try:
            self.teaching[term].append(subj)
        except KeyError:
                self.teaching[term] = [subj]
    def getTeaching(self, term):
        try:
            return self.teaching[term]
        except KeyError:
            return None
    def lecture(self,toWhom,something):
        return self.say(toWhom,something + ' as it is obvious')
    def say(self,toWhom,something):
        if type(toWhom) == UG:
            return MITPerson.say(self,toWhom,'I do not understand why you say ' + something)
        elif type(toWhom) == Prof:
            return MITPerson.say(self,toWhom,'I really liked your paper on ' + something)
        else:
            return self.lecture(something)
 
##me = Prof('Grimson', 'Eric', 'Full')
##me.addTeaching('F08', '6.00')
##me.addTeaching('S09', '6.00')
##me.addTeaching('S09', '6.xxx')
##print me.getTeaching('F08')
##print me.getTeaching('S09')
##print me.getTeaching('S08')
##print me.teaching
    
class Faculty(object):
    def __init__(self):
        self.names = []
        self.IDs = []
        self.members = []
        self.place = None
    def add(self,who):
        if type(who)!= Prof: raise TypeError('not a professor')
        if who.getIdNum() in self.IDs: raise ValueError('duplicate ID')
        self.names.append(who.familyName())
        self.IDs.append(who.getIdNum())
        self.members.append(who)
    def __iter__(self):
        self.place = 0
        return self
    def next(self):
        if self.place >= len(self.names):
            raise StopIteration
        self.place += 1
        return self.members[self.place-1]

##grimson = Prof('Grimson','Eric', 'Full')
##lozano = Prof('Lozano-Perez', 'Tomas', 'Full')
##guttag = Prof('Guttag', 'John', 'Full')
##barzilay = Prof('Barzilay', 'Regina', 'Associate')
##course6 = Faculty()
##course6.add(grimson)
##course6.add(lozano)
##course6.add(guttag)
##course6.add(barzilay)
##
##for p in course6: ##    print p.familyName()
##
##
##print ug.say(grimson,'I do not understand')
##print grimson.say(ug,'you do not understand')
##print grimson.say(guttag,'why the sky is blue')
##
##print ug.sing(ug,'I think I finally understand') 


例-1の実行結果

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.

    ****************************************************************
    Personal firewall software may warn about the connection IDLE
    makes to its subprocess using this computer's internal loopback
    interface.  This connection is not visible on any external
    interface and no data is sent to or received from the Internet.
    ****************************************************************

IDLE 2.6.4  
>>> ================================ RESTART ================================
>>>
>>> ================================ RESTART ================================
>>>
>>> ================================ RESTART ================================
>>>
>>> grimson = Prof('Grimson','Eric', 'Full')
>>> lozano = Prof('Lozano-Perez', 'Tomas', 'Full')
>>> guttag = Prof('Guttag', 'John', 'Full')
>>> barzilay = Prof('Barzilay', 'Regina', 'Associate')
>>> course6 = Faculty()
>>> course6.add(grimson)
>>> course6.add(lozano)
>>> for p in course6: print p.familyName()
Grimson
Lozano-Perez
>>> if p in course6: print p.familyName()
Lozano-Perez
>>> for p in course6: print p.familyName()
Grimson
Lozano-Perez
>>> course6.add(guttag)
>>> course6.add(barzilay)
>>> for p in course6: print p.familyName()
Grimson
Lozano-Perez
Guttag
Barzilay
>>> if p in course6: print p.familyName()
Barzilay
>>> print ug.say(grimson,'I do not understand')
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    print ug.say(grimson,'I do not understand')
NameError: name 'ug' is not defined
>>> UG.say(grimson,'I do not understand')
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    UG.say(grimson,'I do not understand')
TypeError: unbound method say() must be called with UG instance as first argument (got Prof instance instead)
>>> print grimson.say(guttag,'why the sky is blue')
Eric Grimson says to John Guttag: I really liked your paper on why the sky is blue
>>> ug = UG('Doe', 'Jane')
>>> print ug.say(grimson,'I do not understand')
Jane Doe says to Eric Grimson: Excuse me, but I do not understand
>>>
>>> 



Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。
Python_idle_1_small


-------------------------------------------------

講座第16回のリーディングアサイメント

1. Chapter 12 of How to Think Like a Computer Scientist: Learning with Python

-------------------------------------------------

-------------------------------------------------

No comments:

Post a Comment

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第2回

  MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第2回 オープンコースウエア 大学名:MIT 講座名:6.00 Introduction to Computer Science and Programming Download course material ...