sonoshouのまじめなブログ

情報系大学生からのウェブ見習い人生の記録

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