python復習まとめ4
モジュールの例
フィボナッチ数列の文字列から、モジュールについて学ぶ。#fibo.pyの中身 def fib(n): a ,b = 0, 1 while b < n: print b, a, b = b, a+b print if __name__ == "__main__": import sys fib(int(sys.argv[1]))
- モジュールとして使う。
- モジュールをスクリプトとして実行する。
以上の2通りの例を示す。
#モジュールとして使う。 >>> import fibo >>> fibo.fib(10) 1 1 2 3 5 8 #モジュールとして使う。 #(ただし、可動性が乏しくなるため、あまり推奨されない。) >>> from fibo import * >>> fib(10) 1 1 2 3 5 8 #モジュールをスクリプトとして実行する。 #(コンソール上から起動。) >python fibo.py 10 1 1 2 3 5 8
コンソールから呼ばれた場合は、
if __name__ == "__main__":
の中身が走ることとなる。
クラスについて
基本的なクラスを理解するためのテストモジュールを作成した。非常に見づらくなってしまったのは、私の復習用だからということにしよう……。
クラスメソッド、インスタンスメソッドを呼び出す時、
呼び出し元のインスタンスもselfとして引数に与えられるが特徴的である。
そのため、メソッドの初めの引数はselfにすることが推奨されている。
import math class MyPoint: num = 0 #initialize def __init__(self, x, y): MyPoint.num += 1 self.id = MyPoint.num self.x = x self.y = y def distance(self,point): result = math.sqrt(math.pow(self.x - point.x, 2) + math.pow(self.y - point.y, 2)) return result @classmethod #error if you don't use decorator def initNum(self): MyPoint.num = 0 if __name__ == "__main__": #create list classList = [] classList.append(MyPoint(0,1)) classList.append(MyPoint(2,0)) #output list and output instance var for v in classList: print 'id =',v.id, 'x =',v.x, 'y =',v.y #output class var print 'MyPoint Num =',MyPoint.num #test instance method print 'Distance =',classList[0].distance(classList[1]) #test class method MyPoint.initNum() print 'MyPoint Num =',MyPoint.num
クラス継承について
pythonは多重継承をサポートする。
ただし、多重継承はプログラムが複雑になりやすいので、推奨はされない。
また、一般的なオブジェクト指向言語は変数とメソッドの両方が継承されるが、
pythonでは、メソッドとクラス変数は継承されるが、インスタンス変数は継承されない。
従って、pythonでは、インスタンス変数を継承するために明示的にプログラムを書く必要がある。
class Hoge: def __init__(self, x, y): self.x = x self.y = y def get_x(self): return x def get_y(self): return y class Fuga: def __init__(self, z): self.z = z def get_z(self): return z class HogeFuga(Hoge,Fuga): def __init__(self, x, y, z): Hoge.x = x Hoge.y = y Fuga.z = z if __name__ == "__main__": hogefuga = HogeFuga(1, 2, 3) print hogefuga.x print hogefuga.z