ホーム 戻る
TO HELEN
Helen, thy beauty is to me Like those Nicean barks of yore, That gently, o'er a perfumed sea, The weary, wayworn wanderer bore To his own native shore.
Lo! in yon brilliant window-niche How statue-like I see thee stand, The agate lamp within thy hand! Ah, Psyche, from the regions which Are Holy Land!
Edgar Allan Poe"
20131015改訂中
オブジェクト:プログラム上のデータすべて。データ型、整
数、関数、メソッド、 クラス、モジュール、すべてオブジェクト。 すべて識別子、型、値を持つ。 s=”奈良の大仏” sは奈良の大仏という文 字列型のオブジェクト。 識別子はメモリ上の位置へのポインタ。 オブジェクト作成後、その識別子と型は変更
できない。 オブジェクトの値を変更できる場合、ミュータブル(変更可能)という。 変更できない場合はイミュータブル(変更不
能)という。 ただし識別子に別の値のオブジェクトを結びることはできる。 全部関数の引数として渡せる。全部リスト に入る。 インスタンスオブジェクト:メモリ上にクラスから作った部品を記録する領域 ,実例。
is:オブジェクトの同一性、アイデンティティを調べる。
pythonの扱うオブジェクト:number、function、class0 moudule、file、type、instance、・・・・・
オブジェクトの持つ属性:1 identity 2 type 3 value (identityとtypeはread only、valueはmutable) class 相続順位(object): "相続人の相続順位は法定されています" 相続順位クラスを定義 def 順位(): a="配偶者と子" b="配偶者と直系存続" c="配偶者と兄弟姉妹"
print("第一順位 は ",a ) print( "第二順位は ",b) print( "第三順位は ",c) >>> s=相続順位 sに相続順位クラスを代入 >>> s.順位() Sクラスから順位メソッドを呼び 出す
第一順位 は 配偶者と子 第二順位は 配偶者と直系存続 第三順位は 配偶者と兄弟姉妹
class 相続税総額(object): def 税額計算(): a=input('相続取得財産合計> ') a=int(a) b=input('債務及び葬式費用> ') b=int(b) c=a-b print('相続純財産額=',c) d=input('相続人の数> ') d=int(d) e=d*10000000+50000000 print('基礎控除額= ',e) print('課税遺産総額= ',c-e) f=c-e f=int(f/1000)*1000 if f <=10000000 : zeirutu=0.1 koujyo =0 elif f <=30000000 : zeiritu = 0.15 koujyo = 500000 elif f <=50000000 : zeiritu = 0.2 000000 koujyo = 2000000 elif f <= 100000000 : zeiritu = 0.3 koujyo = 7000000 elif f <= 300000000 : zeiritu = 0.4 koujyo = 17000000 else : zeiritu = 0.5 koujyo = 47000000 zei=(f-koujyo) * zeiritu zei =int(zei/1000)*1000 print ('相続税額 = ',zei)
>>> x=相続税総額 >>> x.税額計算() 相続取得財産合計> 250000000 債務及び葬式費用> 5000000 相続純財産額= 245000000 相続人の数> 3 基礎控除額= 800000000 課税遺産総額= 165000000 相続税額 = 59200000
class sakana(object): seisitu="おいしい" tyui="生ものの保存・調理に注意してください。"
>>> iwasi=sakana() >>> iwasi.seisitu0 'おいしい'0 >>> iwasi.tyui '生ものの保存・調理に注意してください。' >>> iwasi.seisitu,iwasi.tyui ('おいしい', '生ものの保存・調理に注意してください。') >>> iwasi.nedan="安い" >>> iwasi.seisitu,iwasi.nedan,iwasi.tyui ('おいしい', '安い', '生ものの保存・調理に注意してください。') >>> >>> tai=sakana()
>>> tai.nedan="高い" >>> tai.seisitu,tai.nedan,tai.tyui ('おいしい', '高い', '生ものの保存・調理に注意してください。')
クラスオブジェクトを作る方法 1.クラス名を定義する。
class クラス名(承継元) 承継元があれば() 内に書く。 クラス定数を宣言する 1.クラスが独自に保持するデータ保存 2.変数を定義する 3.クラス属性はクラス自身が保持する属性。 クラス属性を変更するとすべてのインスタンスに反映。 def メソッド名(self[引数]) : 1.メソッドは関数と同じ形式で書く 2.一つ目の引数に「self」という引 数を持つ 3.複数のメソッドを定義するとき は、メソッド 0 の書式を繰り返す。 承継元:既存のクラスを利用して新しい クラスを定義するとき使うスーパークラスと 呼ぶ。 継承:ほかのクラスを利用して機能を 拡張したク ラスを定義すること。 定義したク ラスで ス ーパークラスのメソッドを実 装しなくても、0 定義しているように使う ことがで きる。
>>> class sakana(object): seisitu="おいしい" tyui="生ものの保存・調理に注意してください。"
>>> class iwasi(sakana): nedan="安い"
0 >>> class tai(sakana): nedan="高い"
>>> iwasi.seisitu,iwasi.nedan,iwasi.tyui ('おいしい', '安い', '生ものの保存・調理に注意してください。') >>> tai.seisitu,tai.nedan,tai.tyui ('おいしい', '高い', '生ものの保存・調理に注意してください。') 2.メソッドを定義する。 必要に応じてプロパティとして使用するメソッ ドを定義する。 メソッドの定義: 1.クラスのブロック内に定義す る 2.必ず最初に「self」という引数 を定義する。 「self」はメソッドのなかで自 分自身(インスタンスオブジェクト)を利用 するときに使う。
コンストラクタ:インスタンスオブジェクト作成時 に、一度だけ使用される初期化 専用のメソッド。 「__init__()」という名前 特別なメソッド:型の変換に使用する。 __init__(self) 初期化用 __str__(self) 文字列変換 アトリビュート(属性)の定義:クラスの持つ変数のような もの。クラスに所属するモノの一員 (メンバー変数) 「self」に続いてドット「・」で 区切り 変数名を記述する。
00
class 通常宅地評価: def __init__(self,路線価,補正率,面積): self.路線価=路線価 self.補正率=補正率0 self.面積=面積 def 評価額(self): print(self.路線価*self.補正率*self.面積)
>>> p=通常宅地評価(250000,1,300) >>> print(p.評価額()) 75000000 None
>>> p2=通常宅地評価(200000,1.2,330) >>> print(p2.評価額()) 79200000.0 None
>>> class お菓子: def 選択(): <振る舞い,メソッド
a="団子" <a,クラス変数 b="お餅" c="せんべい" x=input("好きなお菓子は?団子 お餅 せんべい>") if x==a : print(a," はありません。") if x==b : print(b," さあ、召しあがれ。") if x==c : print(c," あとで、食べましょう。")
>>> s=お菓子 . <インスタンス作成 >>> s.選択() <実行 好きなお菓子は?団子 お餅 せんべい>せんべい せんべい あとで、食べましょう。
>>> s.選択() 好きなお菓子は?団子 お餅 せんべい>団子 団子 はありません。
>>> s.選択() 好きなお菓子は?団子 お餅 せんべい>お餅 お餅 さあ、召しあがれ。
class 母(object): <母クラス定義 def says(): <メソッド定義
print("お手伝いしなさい")
class 姉(母): <姉クラス定義 母クラス継承 def says(): 母.says() print("貴方のベッドルームをきれいにして")
>>> a=母 <インスタンス生成 >>> b=姉 <インスタンス生成
>>> a.says() <母クラスのメソッド・属性参照 お手伝いしなさい >>> b.says() <姉クラスのメソッド属性参照 お手伝いしなさい 貴方のベッドルームをきれいにして
クラスAccount >>> class 勘定: account_type="basic" def __init__(self,氏名,残高): self.氏名=氏名 self.残高=残高 def 預入(self,入金額): self.残高=self.残高+入金額 def 引出(self,出金額): self.残高=self.残高-出金額 def 確認(self): return self.残高
>>> a=勘定("戸張",10000) >>> b=勘定("金子",1000000) >>> a.預入(100) >>> b.引出(200000) >>> 氏名=a.氏名 >>> print(a.__dict__) {'氏名': '戸張', '残高': 10100} >>> print(b.__dict__) {'氏名': '金子', '残高': 800000} >>>
>>> class 勘定: <クラス宣言
account_type="basic" def __init__(self,氏名,残高): __init__は代表的な特殊メソッド インスタンス生成時に呼び出される コンストラクタ self はインスタンス自身を表す selfの内容は自動的に渡される 第二引数以降はインスタンス生成 時に渡した引数と対応する self.氏名=氏名 <クラス自身が保持する属性 個々のインスタンスで共有される クラス属性を変更すると、すべての インスタンスに反映される。 クラスの持つ変数のようなもの メンバ−変数 self.(ドット)変数名の形式
self.残高=残高 同 def 預入(self,入金額): <クラス内で定義する関数 メソッド self.残高=self.残高+入金額 def 引出(self,出金額): 同 self.残高=self.残高-出金額 def 確認(self): 同 return self.残高
>>> a=勘定("戸張",10000) <インスタンス作成 インスタンス属性設定
>>> b=勘定("金子",1000000) <インスタンス作成 インスタンス属性設定 >>> a.預入(100) メソッドをインスタンスが参照 >>> b.引出(200000) 同 >>> 氏名=a.氏名 >>> print(a.__dict__) < __dict__ は特殊メソッド
{'残高': 10100, '氏名': '戸張'}
メッセージ文字列とメッセージを画面に出力する。
class Massage: < クラスの作成 def __init__(self,astring): __init__()コンストラクタ特殊メソッド:新しいオブ クトインスタンスで自動的に呼び出される。 self.text = astring < selfはオブジェクトインスタンス自身
def printit(self): < 実行時にはselfはpythonが自動的に入れる。 print(self.text)
m1=Massage('hello world') < 新しいMassageクラスのインスタンス m2=Massage('楽しかった。') < 新しいMassageクラスのインスタンス note =[m1,m2] オブジェクトをリストに入れる for msg in note: msg.printit() < printit()self引数なしに呼び出せばよい メッセージ順に印刷
hello world 楽しかった。
>>> class Massage: def __init__(self,astring): self.text=astring def printit(self): print(self.text)
>>> m1=Massage("hello world") >>> m2=Massage("楽しかった") >>> note=[m1,m2] >>> for msge in note: msge.printit()
hello world 楽しかった
用語補足 クラスと モジュールとの違い:インスタンスを持つ:継承できる クラス名:単なる変数。実行時にクラスオブジェクトが代入 されるだけが違う。クラス名をインポートすれば、他の変数と同様 に使える。 self:Python で自前の class を作るとき、メソ ッドの第一引数がそのクラスの インスタンスそれ自 身(一般にself と書かれる)であることの理由.メソッドの中でインスタンス オブジェクト自体を利用したいときに使 う。 Python は手続きの定義を、関数定義とメソッド定義に分 ける代わりに、全てを関数定義にし、メソッド定義 として使う場合は第一引数をインスタンスに割り 当てるという約束事を導入。 クラスの設計:クラス名を定義しメソッドを定義しプロパテ ィとして使うメソッ ドを定義する スーパークラス:承継元のクラス クラス名のつけ方:関数名は小文字で始まるがクラス名は 大文字で始まる。 継承:すでに定義されているクラスを拡張して新しいクラ スをつくること。より一般的な物事に対応するクラス から、特 性 を受け継ぐこと。:「名前区間の階層構造」を作る。 コンポジション:GUIシステム:「ウイジェット」部品(ボタ ン、 ラベル)のあつまり:独自の機能を備えた 構成要素(オブジェクト)を組み合わ せて新たなものをつくる。 サーバー:サーバーにプログラムを書いてユーザーはそ れをログインする。 テスト用のサーバーと稼働用のサーバーを分 ける。 確実なプログラムの使用法。 pythonのクラス:基本的にすべての属性はpublicである。 多重承継をサポート、複数のスーパー クラスを持つすべてのクラスがサブクラ スを作ることができる すべてのクラスはオーバ ーライドできる クラスの書式:classに続いてクラス名を書く スーパークラスがあればカッコ内に書く 複数あれば、カンマ を書く 行を変えてインデント インデントが戻ったときに終わる インスタンスの初期化には__init__を書 メソッドの最初の引数はselfと書く
名前空間(namespace):名前からオブジェクトへの対応つ け(mapping)辞書として 実装。異なった名前空間にある名前
の間には全く 関係がな い。 二つの別々のモジュールの双方で、同じ名前の関数を定 義 できる。 組み込み型の名前空間はpython起動時に作成される。 モジュールの名前空間は、定義が読み込まれた時に作 成され、終了まで残る。組み込み型の名前空間は __builtin__モジュールのなかに存在する。 関数のローカルな名前空間は関数が呼び出されたとき作 成さ、戻ったとき削除される。 スコープ:ある名前空間が直接アクセスできる領域。実 行中直接アクセス可能な三つの入れ子になっ たスコープがある。最も内側に関数群のスコー プが最初に検索される。
中間のスコープにモジュールのグローバルな名 前が入っている。二番目に検索される。
最も外側のスコープに組み込みの名前が入って いる。最後に検索される。
スコープはテキスト上で決定されている。
属性:ドットに続くすべてをさす。 書き込み専用、読み取り専用にできる。 データ属性:インスタンス変数、最初に代入された時点で 生成される。 メソッドオブジェクト:クラスのインスタンスオブジェクトに 属 している関数のこと。
メソッド:関数オブジェクトの一種、classステートメントの ボディ部分、defステートメントで作られる。メソッ ドはインスタンスの機能を規定する。
(pythonチュートリアル guido著 オライリー・ジャパン)
クラス定義
クラス定義はdef文と同様一度実行して効果を出す。 クラス定義中の文は普通関数定義文。 他の文も使える。 クラス定義で新しい名前空間ができる。 クラス定義が終わるとクラスオブジェクトが作られる。 クラスオブジェクトはクラス定義で作られた名前空間を包むラッパー。
クラスオブジェクト
属性参照:obj.nameで名前空間にあった名前のすべてが有効。 命名規約:メソッド名は大文字で始める。データ属性名の先頭にに下線をつける。 self:メソッドの最初の引数をselfとする・
リスト1
class my_class: def __init__(self): self.value = 1000 <self.valueはインスタンス変数
# 加算 def add(self, v): self.value += v
# 減算 def sub(self, v): self.value -= v
def get_value(self): return self.value
>>> ob=my_class() >>> ob.add(100) >>> ob.get_value() 1100 >>> ob.sub(300) >>> ob.get_value() 800 >>> 関数名__init__ は要素を生成する時に最初に実行される関数名として予約されている。 self 代入文現れる予約語self はこれから生成するオブジェクトを表している。そのオブジェクトの内部変数v にt を代入するのがi3 の文である。関数__init__ の第1 引数はself でなければならない。内部変数の名前は好きなように付けて構わない。 クラス定義文の中で定義されている関数をメソッドと言う。クラスの内部変数とメソッドをクラスの属性と言う。
クラス定義 class my_class:
クラスの定義は class class_name(*super_classes): .......
で行う。スーパークラスがあれば、それを引数に与える。多重継承もある。
メソッドの定義
メソッドの定義は関数定義と同じ def を用いる。最初の仮引数はインスタンスそれ自身。self
クラスを定義する文法は、次のようになる。 class 定義するクラス名 : メソッド定義など...
メソッドを定義する
メソッドを定義する文法は、関数とほとんど同じで、次のようになります。 def 定義するメソッド名 ( 自オブジェクト変数名, 引数, ... ) : 文...
関数定義と違うのは、最初の引数として操作対象となるオブジェクトを指す変数を用意する。この変数の名前は何でもいいが、慣例的にselfとする。
__init__メソッドは、特別なメソッドで、オブジェクトが生成されるときに呼び出される。
インスタンスの生成
特別なメソッド __init__ でインスタンスを生成。 __init__ の最初の仮引数 self はインスタンス自身で、それ以降の引数がインスタンス生成時に与えられる引数。
インスタンス変数
オブジェクトの内部状態を保持する変数をインスタンス変数という。インスタンス変数は、次のように書く。 オブジェクト . 変数名 # 文法
上記のリストでは、self.value がインスタンス変数。インスタンス変数は、オブジェクトが生成されるたびに作られ、オブジェクトのメソッドで共有できる。オブジェクトが消滅するまで生き続ける。
クラス定義
class className [(super_class1[, super_class2]*)]: suite
関数オブジェクトを生成し className という名前に代入する。 suite には、ローカルのクラスメソッドの定義と、クラス属性への代入を記述できる。 class MyClass (class1, class2): ... class1 と class2 とを継承したクラスオブジェクトを生成する。 その新しいクラスオブジェクトを名前 MyClass に代入する。
class MyClass: ... 基底 クラスオブジェクト (何も継承しないクラス) を生成する。 その新しいクラスオブジェクトを名前 MyClass に代入する>
class MyClass (object): ... 新形式 クラス(object を継承するクラスは 新形式 クラスとなる。2.2 以降で利用できる) を生成する。その新しいクラスオブジェクトを名前 MyClass に代入する。 ? クラス インスタンス メソッドの第 1 引数は、そのメソッドでの操作対象となるインスタンスオブジェクトとする。 'self' とするのが慣習である。
インスタンスの生成は、クラスオブジェクトを 「コールする」ことで行う。引数指定もできる 。
親クラスにアクセスするは、そのメソッドを直接コールし、"self" を明示的に指定する 数値演算子やシーケンス、マップインデックスなどを実装する特殊メソッドが利用できる。
ドキュメンテーション文字列 モジュール・クラス・関数には、説明文を記述できる。それは、 それらの内容の先頭部分に文字列リテラルを記述することで行う。この説明文は、 モジュール・クラス・関数内において '__doc__' 属性で取得できる。
>>> class Message: def __init__(self, aString): self.text = aString def printIt(self): print (self.text)
>>> m1 = Message("Hello world") >>> m1.printIt() Hello world >>> m2=Message("so long ,it was short but sweet") >>> m2.printIt() so long ,it was short but sweet
"A simple example class" <文
i = 12345 <式 def f(self): <関数 return "hello world"
>>> x = Myclass() <クラスの新しいインスタ ンスを生成し、オブジェクトをローカル変数xに代 入する。
>>> x.i < 属性参照 12345 >>> x.f() < 属性参照
'hello world'
>>> x.f() < x.f()はMyclass.f(x)と等価
'hello world' >>> Myclass.f(x) 'hello world'
>>> class C: def __init__(self, val): self.val = val def f(self): print ("hello, my value is:", self.val)
>>> a=C >>> b=C >>> a=C(27) >>> b=C(42) >>> a.f() hello, my value is: 27 >>> b.f() hello, my value is: 42
例示
>>> class 相続税基礎控除: <クラスを作る "相続税基礎控除" <文 def 控除(self): <関数 a=input("相続人の数= ") a=int(a) b=a*10000000+50000000 print("相続税基礎控除額 ",b)
相続人の数= 5 相続税基礎控除額 100000000 インスタンス生成操作を行うと空のオブジェクトを生成す る。 __init__という特別なメソッドを定義すると、初期済みのイ ンスタンスを得ることができる 複数の引数を持たせることができる。クラスのインスタン ス生成操作に渡された引数 は__init__()メソッドに渡される。
class Complex: def __init__(self,realpart,imagepart): self.r = realpart self.i = imagepart
>>> x = Complex(3.0, -4.5) >>> x.r,x.i (3.0, -4.5)
>>> class Class: def method(self): print("I havr a self")
>>> i = Class() < インスタンスを作る
>>> i.method() < メソッドを呼び出す I havr a self
>>> def func(): < 関数を作る print ("I don't...")
>>> i.method = func()
< メソッドを変更して呼びす I don't...
class Bird: <クラス定義 song = "sqweek" <式 def sing(self): <関数 print (self.song)
>>> b = Bird() <インスタンス >>> b.sing() <属性参照 sqweek
>>> class MyClass: '簡単なクラスの例' <文 tel = 9999 <telが属性参照できる。telの値変 更できる。 def f(self): <インスタンスが属性参照できる関数 return '自利自他'
>>> x = MyClass() <クラスのインスタンス化。新しいクラスがローカル変 数xに代入される。クラスオブジェクトのコール。空のオ ブ ジェクトを生成する。
>>> x.tel <メソッドのオブジェクトをコールする。
9999
>>> x.f() < メソッドのオブジェクトをコールする。
'自利自他'
>>> x.__doc__ < __doc__ も有効な属性classのdocstringを返す。
>>> class 基礎控除: """所得税38万円、贈与税110万円、相続税5千万円+1千万円×法定 相続人の数"""
>>> 基礎控除.__doc__
'所得税38万円、贈与税110万円、相続税5千万円+1千万円×法定相続 人の数'
>> class ShareData: spam = 42 >>> x = ShareData() >>> y = ShareData() >>> x.spam,y.spam (42, 42)
>>> ShareData.spam = 99 >>> x.spam,y.spam,ShareData.spam
(99, 99, 99)
特殊メソッド __init__
クラスのオブジェクトは初期状態にカスタマイズしたイン スタンスである。このために__init__という特殊なメソッド が定義できる。
class Complex: def __init__(self,real,image): <メソッドの第一引数はselfと呼ばれる。
self.r = real self.i = image
. >>> x = Complex(3, -7) >>> x.r, x.i
(3, -7)
>>> x = Complex('高津区','溝口駅') >>> x.r, x.i
('高津区', '溝口駅')
インスタンスオブジェクト
インスタンスオブジェクトが理解できるのは属性参照だ けである。 有効な属性名はデータ属性とメソッド インスタンス変数に相当する。 データ属性は宣言せず、代入すればよい。 >>> class My: i=123 s='str'
>>> my.i 123
>>> my.s
'str'
class First: def setdata(self, value): self.data = value def display(self): print(self.data)
>>> x = First() >>> y = First() >>> x.setdata('税理士会') >>> y.setdata('国税庁') >>> x.display() 税理士会
>>> y.display()
国税庁
同族会社の意義について、内容のコンテナー(リスト、 辞書)のクラスを作る インスタンスを呼び出す。
class 同族会社: 特別規定 = ['行為計算の否認','役員使用人兼務役員 の範囲','留保金課税','特殊支配同族会社の役員給与'] 同族会社意義 = {'原則':'株主等3人以下と特殊関係個人 法人が出資総額の50%','一定の場合':['一定の議決権 につき総数の50%超の数所有','合名合資合同社員総 数の半数超'],'同族関係者':['株主等親族等','子会社等 保有割合50%超']}
>>> 同族会社.特別規定
['行為計算の否認', '役員使用人兼務役員の範囲', '留 保金課税', '特殊支配同族会社の役員給与']
>>> 同族会社.同族会社意義
{'原則': '株主等3人以下と特殊関係個人法人が出資総 額の50%', '一定の場合': ['一定の議決権につき総数 の50%超の数所有', '合名合資合同社員総数の半数 超'], '同族関係者': ['株主等親族等', '子会社等保有割 合50%超']} (2)クラスの解説(柴田pythonプログラミング入門)
classという語によって定義:defで関数を定義するのと 同じ感覚 classの中で機能する専用の関数つまりメソッドを定義 する。そのclass専用のメソッドとなる。
>>> class FirstClass : <クラス名宣言 a = "hello" <クラス変数クラスの属性aを定義 def m(self) : <メソッドmを定義 print FirstClass.a <メソッドmを定義クラスの内部でもク ラス変数 にアクセスするには、クラス変数の前にクラス 名とドットをつける。
>>> FirstClass.a
<クラス変数にアクセス:クラス名.クラス変数 'Hello'
>>> FirstClass.a = "Goodbye" < クラス変数の値を変更: >>> FirstClass.a
'Goodbye'
>>> FirstClass.m <クラスの内容確認
<unbound method FirstClass.m> < mの実態がない
>>> i = FirstClass() < インスタンスを生成 >>> FirstClass.m(i)
Goodbye
>>> i.m() < 一般的な呼び出し法
Goodbye
>>> class SecondClass: a="hello" <クラス変数定義 def m(self): <メソッド定義
<self:代名詞のようなもの:クラス を定 義しているときは存在しないインスタン スを仮に表す。:未来に生成されるイン タンスを一つの「self」で表現する self.a="Goodbye" < インスタンス変数;その中だけで有効 print self.a
>>> SecondClass.a <クラス変数にアクセス
'hello'
>>> SecondClass.a = "GoodNight" <クラス変数に代入 >>> SecondClass.a
'GoodNight'
>>> i=SecondClass() <インスタンスを生成 >>> i.m() <mを呼び出す
Goodbye <インスタンス変数の値
>>> SecondClass.a = "GoodMorning" < aの値を変更 >>> SecondClass.a
'GoodMorning'
>>> i.m() <メソッドmを呼び出す:値はかわらない: クラス変数とインスタンス変数は内部 では完全に区別されている。 Goodbye
>>> SecondClass.a
'GoodMorning'
>>> class thirdclass: a="hello" def m(self): print ( self.a)
>>> thirdclass.a
'hello'
>>> i = thirdclass() >>> i.m()
hello
>>> thirdclass.a = "goodbye" >>> thirdclass.a
'goodbye'
>>> i.m
<bound method thirdclass.m of <__main__.thirdclass instance at 0x00DB4FD0>>
>>> i.m()
goodbye
(3)サブクラスを作る
class FirstClass: <クラス文:見出し def setdata(self,value): < メソッド self.data = value < selfにインスタンスを渡す def display(self): < メソッド print(self.data) < ()内はインスタンスの属性 class SecondClass(FirstClass): <サブクラスを作るsetdataは継承 def display(self):
<メソッドdisplayは変更する。
print('curent value = "%s"' % self.data)
>>> x = FirstClass()
< インスタンスの作成:名前空間創出
>>> y = FirstClass() 同 >>> x.setdata('土方歳三') <メソッドを呼び出しselfに値が渡される。 >>> y.setdata(12000) <メソッドを呼び出しselfに値が渡される。 >>> x.display() <xインスタンスの値を出力
土方歳三 >>> y.display()
12000 <yインスタンスの値を出力
>>> x.data = '芹沢 鴨' < クラスの外で属性の値を変更 >>> x.display()
芹沢 鴨
>>> x.anothername = '近藤勇' < 新しいインスタンス属性を作る >>> x.anothername
'近藤勇'
>>> z = SecondClass() <インスタンス の作成:名前空間創出 >>> z.setdata(12000) < setdataはFirstClassのものを使う。 >>> z.display()
curent value = "12000"
<displayメソツドはSecondClassで変更され ている。
(4)世界一簡単なPythonクラス
クラスもインスタンスも名前空間で、属性は代入によって 作られる 代入は通常class文のなかでおこなわれる 必要に応じて別の場所でもできる オブジェクトツリーのどのクラス、インスタンスにも属性 追 加ができる メソッドも同じ メソッドはclass文の中のdef文で作られるが、クラスオ ブ ジェクトと全く独立にも作ることができる。
class rec:pass < 空の名前空間を作る。pass何もしない
>>> rec.name = '戸張' < 対話型で代入コードを書く >>> rec.age = 77 < 別の属性を追加できる。 >>> print (rec.name) < 普通の構文でアクセスする pascalのreco 戸張 rdと同じ オブジェクトに名前のついたフィールドがある状態 ディクショナリのキーと似ている。
クラスのリファレンスがあれば、いつでも、属性の設定 変更可能・
>>> x = rec() <インスタンスの名前空間を作り、クラス変数を継承 >>> y = rec() <クラスから属性を継承:インスタンスには自分の属性は ないが、クラスのname属性から代入されている値を取り出す >>> x.name,y.name
('戸張', '戸張')
>>> x.name = '山田' インスタンスに新しく同じ名前の属性を設定し、値を代入すれば、それが優先され る。オブジェクトツリーの属性検索は下から上に検索され、該当属性が1っ見つかれ ばそこで終了する。これはそのインスタンスにしか影響しない。yはクラスの属性をそ のまま継承。
>>> rec.name, x.name, y.name
('戸張', '山田', '戸張') >>> rec.__dict__.keys()
名前空間の属性はディクショナリになる。クラス・インスタンスで 名前空間となるディクショナリは、__dict__という属性になる。
['__module__', 'name', 'age', '__dict__', '__weakref__', '__doc__']
>>> x.__dict__.keys() <dict_keys object at 0x01477570>
>>> x.__class__ <リンクには__class__がつかわれる
<class '__main__.rec'>
>>> class rec:pass
>>> rec.name = 'bob' >>> rec.age = 40 >>> print (rec. name)
bob >>> x = rec() >>> y = rec() >>> x.name, y.name
('bob', 'bob') >> x.name = 'sue' >>> rec.name ,x.name, y.name
('bob', 'sue', 'bob')
独立に次のコードをつくる。 >>> def upperName(self): <selfが必要 return self.name.upper() nameにオブジェクトが渡されれば使える
>>> rec.method = upperName
上の関数をクラスの属性に代入すると、関数 はメソッドになり、インスタンスをつかって呼び出せる。
(5)モジュ−ルの具体例
(a)timeモジュ−ル
datetime 日付、時刻の基本形:モジュール名:クラス名
日付時刻情報の差を「d日とh時間m分s秒」形式で取得。
import datetime a = datetime.datetime(2006,1,14,12,0,30) b = datetime.datetime(2007,4,1,1,0,12) td = b - a dd = td.days HH = td.seconds / 3600 MM = td.seconds % 3600 / 60 SS = td.seconds % 60 print ( ' %d日と %d 時間 %d分 %d秒' %(dd,HH,MM,SS))
441日と 12 時間 59分 42秒
ある日付と別の日付の間の日数を取得。
import datetime a = datetime.datetime(2005,4,29) b = datetime.datetime(2007,1,31) c = b - a print c 642 days, 0:00:00 <2005/4/29午前0時から2007/1/31午前0時まで の日数:指定された終わりの日は日数としてカウン トされない。
現在時刻を取得。
import datetime today = datetime.datetime.today() 最初のdatetimeはdatetimeモジュ ールの指定・次はその中のdatetimeクラスの指定・ print (today)
2009-01-08 17:42:36.218000
書式を指定
import datetime today = datetime.datetime.today() today = today.strftime("%y/%m/%d/ %H:%M:%S") print today 08/07/30/ 18:57:31
特定のディレクトリの内容を取得
>>> import os >>> os.listdir('c:\\') ['9249379a87f0170bffd4a3', 'account', 'AppFolder', 'AUTOEXEC.BAT', 'a_new', 'b96ecbbd37a1103e25bc', 'BASICw32', 'Books', 'BOOT.INI', 'bootfont.bin', 'BOOTLOG.PRV', 'BOOTLOG.TXT', 'BOOTSECT.DOS', 'Borland', 'BTI', 'Cache2', 'Cache3', 'Cache4', 'Cache5', 'CacheKit', 'CacheSys', 'CONFIG.SYS', 'Converter.exe', 'DB2', 'DELPHI', 'DLA.TAG', 'Documents and Settings', 'DRIVERS', 'drivez.log', 'FENGDIC', 'FlexLM', 'hiberfil.sys', 'HON.TMM.LNK', 'I386',
・・・・・
(4)練習問題
1.生まれた年月日をたずねて、年齢を計算し、過ごしてきた誕生日それぞれに、おめでとう!をプレゼントする しましょう。
(5)モジュール
モジュール:プログラミングの4ッ目の基本構造(順次実行・ループ・分岐・モジュール)再利用可能なコードを集めてパッケージ化したもの
関数の再利用:関数の独立性を高める:ある機能を分離して別のファイルに整理したもの:関数のサンプルをモジュールに変換
クラスとの違い: モジュールはインスタンスを持たない モジュールは継承できない
モジュール:クラスは実体(データ)と振舞い(処理)を持った「もの」を表現する。モジ ュールは処理の部分だけをまとめるもの。 モジュールの使い方: 名前空間の提供:グローバルな名前空間に別の名前空間を作成。 名前空間:メソッド・定数・クラスの名前がぶつからないようにする。名前のコ レクション。
使う 参照する: モジュール名.メソッド名(引数)
作る
(6)プローシージャー・関数としてのモジュールを使う ライブラリー:言語に付属している関数 引数:関数の内部変数・関数の呼び出し時に渡す値
>>> x = 2 < 基数2 >>> for y in range(0,11): print pow(x, y) < 2のy階乗 1 2 4 8 16 32 64 128 256 512 1024
>>> import string stringモジュールを呼び出す >>> dir(string) dir関数・有効な名前(関数)のリスト表示 ['Template', '_TemplateMetaclass', '__builtins__', '__doc__', '__file__', '__name__', '_float', '_idmap', '_idmapL', '_int', '_long', '_multimap', '_re', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'atof', 'atof_error', 'atoi', 'atoi_error', 'atol', 'atol_error', 'capitalize', 'capwords', 'center', 'count', 'digits', 'expandtabs', 'find', 'hexdigits', 'index', 'index_error', 'join', 'joinfields', 'letters', 'ljust', 'lower', 'lowercase', 'lstrip', 'maketrans', 'octdigits', 'printable', 'punctuation', 'replace', 'rfind', 'rindex', 'rjust', 'rsplit', 'rstrip', 'split', 'splitfields', 'strip', 'swapcase', 'translate', 'upper', 'uppercase', 'whitespace', 'zfill']
(7)モジュールを使う
>>> import math <使う >>> print math.pi 3.14159265359 >>> print math.sqrt(2) 1.41421356237
モジュール名を記述せず、関数、変数を直接利用したいとき from文を使ったimport:
>>> from math import sin,radians >>> 10 * 20 * sin(radians(45)) / 2 70.710678118654741
(8)モジュールを作る
pythonのモジュールはpython文が記述されたテキストファイル ほとんどの場合記述された文は関数定義
ホーム 戻る |