演習5:クラス継承を使いこうなそう
演習5.1
pow() の機能を実現するメソッドpow() を持つクラスPOWを定義してみましょう。
pow(x、n)
pow() は2つの引数 x と n を受けとり、"x の n 乗" の結果を返す
code: python
class POW:
def __init__(self, x=0, n=0):
pass
def pow(self, x=None, n=None):
pass
if __name__ == '__main__':
obj = POW(2,-3)
print(obj)
print(obj.pow())
obj(4,2)
print(obj.pow())
print(obj(4,2).pow())
print(obj.pow(2,3))
obj.pow(0,-1)
インスタンス作成時に2つの値(x, y) を指定できるようにします
obj=POW(2,2)
メソッドpow()に値を指定でき、その値を保持できるようにします
obj.pow(2,3); obj.pow()
呼び出し可能オブジェクトをサポートしましょう
obj(2,3), obj(2,4).pow()
pow(0, 負数) のときは "cannot negative power" を表示しよう
POWクラスを含むモジュール pow を作成しよう
演習5.2
メソッド getString() と capString() を持つクラスStrKeeperを作成しよう
code: pyhon
class StrKeeper():
def __init__(self):
pass
def getString(self):
pass
def capString(self):
pass
if __name__ == '__main__':
s = StrKeeper()
ss = s.getString('Input Str :')
print(ss)
s.getString('Input Str :')
print(s.capString())
getString() はユーザーの入力した文字列を返し、それをリストとして保持します
ヒント: ユーザーの入力を処理する関数はinput()です
capString() は保持している文字列のリスト要素を大文字に変換したリストを返します
ヒント: dir(str) を見てみましょう
StrKeeperクラスを含むモジュール strkeeper を作成しよう
演習5.3
矩形の面積を計算するメソッドarea()を持つクラスRectangleを作成しよう
StrKeepクラスを継承して、ユーザからの入力を処理できるようにします
インスタンス作成時に縦横の値(lengthとwidth)を受けることもできるようにします
インスタンス作成時に引数が指定されなければユーザからの入力値で処理します
ヒント: __init__()メソッドが実行されるかどうかは...
code: python
from strkeeper import StrKeeper
class Rectangle(StrKeeper):
def __init__(self, length=None, width=None):
pass
def area(self):
pass
if __name__ == '__main__':
obj = Rectangle(3,3)
print(obj.area())
print(obj(4,3).area())
obj = Rectangle()
print(obj.area())
演習5.4
円の面積を計算するメソッドarea()を持つクラスCircleを作成しよう
StrKeepクラスを継承して、ユーザからの入力を処理できるようにします
インスタンス作成時に半径radiusの値を受けることもできるようにします
インスタンス作成時に引数が指定されなければユーザからの入力値で処理します
ヒント: __init__()メソッドが実行されるかどうかは...
πの値として3.141592653589793 を保持するアトリビュート piを持ちます
面積の計算 $ 2 \pi R^{2} にPOWクラスを継承して利用するようにします。
アトリビュート pi は外部から書き換えられないようにします
ヒント: プロパティーを利用すると...
code: python
from pow import POW
from strkeeper import StrKeeper
class Circle(StrKeeper, POW):
def __init__(self, radius=None):
pass
def area(self):
pass
if __name__ == '__main__':
obj = Circle(3)
print(obj.pi)
obj.pi = 3.14
print(obj.pi)
print(obj.area())
print(obj(4).area())
obj = Circle()
print(obj.area())
チャレンジ課題
演習5.5
StrKeeperクラスを継承して、ユーザが入力した文字列を数値チェックして返す validate() メソッドを持つValidatorクラスを作成しよう
validate(val, valstr, prompt, retry, positive)
val: 検証する値
valsttr: val を表す文字列
prompt: val が None のときユーザから入力待ちで表示するプロンプトメッセージ
positive: True にすると負数が与えられると再度ユーザから入力待ちになる
利用例:
length = obj.validate(length, 'Length', 'Please input length', retry=3, postive=True)
ユーザ入力文字列をfloat()で変換できなければ,再度入力待ちになるようにしよう
positive=True のときretryで指定した回数を超えると '{valstr} must be set positive value' を表示しValueErrorとしましょう
positive=False のときretryで指定した回数を超えると 'Too many retries' を表示しValueErrorとしましょう
演習: 5.6
Validatorクラスを継承して、Rectangleクラスで数値チェックをするように修正しよう
演習: 5.7
Validatorクラスを継承して、Circleクラスで数値チェックをするように修正しよう