Pythonでは、クラスはデータと機能を同時にラップするのに役立ちます。Python 3では、ビルトインと呼ばれるいくつかのクラスがすでに用意されています。int(整数クラス)、str(文字列クラス)、list(リストクラス)です。この記事では、.NETで定義されたコーディングのためのドキュメントとして、pythonコードの原則を使用します。
クラス入門
-
Python IDEを開きます。この方法はPythonのインストールで学ぶことができます。
-
キーワード class を使い、その後にスペース、クラス名、コロンを続けます。クラス Duck:
-
クラスの基本変数をインデントして追加します。これを行うには、↵ Enter または ⏎ Return を押します。基本変数をインデントして書き出し、等号、そして引用符で囲みます。クラス Duck: says = "Quack" gender = "Male" name = "Richie"
-
クラスのインスタンスを作成して変数にアクセスします。
- pythonでは、ドット記法はクラスで定義されたメソッドや変数にアクセスするために使われます。
- 以下に例を示します。
class Duck: says = "Quack" gender = "Male" name = "Richie" myDuck = Duck() # Duckクラスのインスタンスを生成 what = myDuck.says # Duckクラスの変数 says にアクセスし、変数 "what" に代入 # print(what) # "Quack" と表示する。 -
クラスに関数を追加する(これをクラスのメソッドと呼ぶ)。
- ここで、クラスの機能性と値を格納する能力がわかる。
class Duck: says = "Quack" gender = "Male" name = "Richie" def fly(): print('Duck flies') -
クラスのメソッドを呼び出す。
- メソッドもドット表記を使います:
- 通常の関数と同じように、括弧を使って myDuck のメソッドを呼び出します。
class Duck: says = "Quack" gender = "Male" name = "Richie" def fly(): print('Duck flies') my_Duck = Duck() my_Duck.fly() # "Duck flies" と表示する。 -
クラスの属性を変更する。class Duck: says = "Quack" gender = "Male" name = "Richie" def fly(): print('Duck flies') my_Duck = Duck() my_Duck.gender = "Female" # my_Duckの変数genderの値を変更 # これで、my_Duck.genderを表示すると、"Female "と出力される。
-
クラスを初期化する。クラスは、プログラマーがそのクラスのインスタンスを作成するたびに初期化関数を実行します。
- この関数を作るには、クラスの1行目と2行目の間に空白を入れ、2行目に def __init__(self): と入力します(必ずインデントしてください)。
- Duckの例では(selfについては後述):
class Duck: def __init__(self): self.says = 'Quack' self.gender = "Male" self.name = "Richie" def fly(): print('アヒルは飛ぶ') my_Duck = Duck() # 変数を取得する方法は同じですが、今は関数にラップされています。selfは、作成されるDuckクラスのインスタンスです。この単語は、__init__関数の最初の引数である限り、プログラマーが望むものであれば何でもよい。
-
init__関数にデフォルト引数を追加する。引数を取らないクラスは不格好です。まず、クラス定義の後に次のようにpythonコンソールに入力します:class Duck: def __init__(self): self.says = 'Quack' self.gender = "Male" self.name = "Richie" def fly(): print('Duck flies') my_Duck = Duck() my_Duck.says = 'I don't want to quack' my_Duck.gender = "Female" my_Duck.name = 'Lizz' new_Duck = Duck() new_Duck.name = 'Dude' new_Duck.says = "IDK"
同じ処理を1行で行うには、もっといい方法がある。これにはDuckクラスを少し操作する必要がある:
class Duck: def __init__(self, says='Quack', gender='Male', name='Richie'): self.says = says self.gender = gender self.name = name def fly(): print('Duck flies')この例を引数から掘り下げてみよう:
- says='Quack', gender='Male', name='Richie' - これらはデフォルトの引数で、プログラマーが関数に何か他の値を入力すると、引数はその値を代わりに取る。プログラマーが何も入力しなければ、引数は=演算子で代入された値をとります。
- 最後に、変数は、プログラマーがクラス・メソッドを呼び出したときに生成されるクラスのインスタンスに追加されます。
-
デフォルトの変数を持つクラスのインスタンスを作成する。この例では、2つ前のDuck(my_Duckとnew_Duck)を再作成します。class Duck: def __init__(self, says='Quack', gender='Male', name='Richie'): self.says = says self.gender = gender self.name = name def fly(): print('Duck flies') my_Duck = Duck('I don't want to quack', 'Female','Lizz') new_Duck = Duck('IDK', name = 'Dude') # または new_Duck = Duck('IDK', 'Male', 'Dude') ''''.以前の「もっさり」コード my_Duck = Duck() my_Duck.says = 'I don't want to quack' my_Duck.gender = "Female" my_Duck.name = 'Lizz' new_Duck = Duck() new_Duck.name = 'Dude' new_Duck.says = "IDK"''.
高度な数値クラス
-
クラスを開始する。これはこの記事のパート1で説明した。今回の例では、分数クラスを書きます:def GCF(n, m): # ユークリッドアルゴリズムを使って最大公約数を求める while n: m, n = n, m % n return m def reduce_fraction(numerator, denominator): g = GCF(numerator, denominator) numerator //= g denominator //= g return numerator, denominator class Fraction: def __init__(self, numerator, denominator = 1): self.fraction = reduce_fraction(numerator, denominator) myFrac = Fraction(3, 4) # 3/4の分数、縮小されない print(myFrac)
出力
<__main__.Fraction オブジェクト at 0x7f5d1c0a1c40>. -
str__メソッドと__repr__メソッドを上書きします。これら2つのメソッドは、print関数を使用してクラスのインスタンスがどのように表示されるかを制御します。優れたプログラマーは、print(myFrac)と入力したときに分数が表示されることを望んでいる。したがって、以下のように追加する:def GCF(n, m): # ユークリッドアルゴリズムを使って最大公約数を求める while n: m, n = n, m % n return m def reduce_fraction(numerator, denominator): g = GCF(numerator, denominator) numerator //= g denominator //= g return numerator, denominator class Fraction: def __init__(self, numerator, denominator = 1): self.fraction = reduce_fraction(numerator, denominator) def __str__(self): return str(self.fraction[0]) + '/' + str(self.fraction[1]) __repr__ = __str__ # ある関数を別の関数に代入 # これはpythonでは合法です。myFrac = Fraction(6, 4) # 6/4 の分数は 3/2 になる print(myFrac)
出力
3/2 -
機能を追加する。関数として記述できる演算子の完全なリストについては、こちらを参照してください。Fractionクラスの例では、加算関数でクラスを拡張します。クラスを足し合わせるために書かなければならない2つの関数は、__add__関数と__radd__関数です。def GCF(n, m): # ユークリッドアルゴリズムを使って最大公約数を求める while n: m, n = n, m % n return m def reduce_fraction(numerator, denominator): g = GCF(numerator, denominator) numerator //= g denominator //= g return numerator, denominator def lcm(n, m): return n // GCF(n, m) # or m // GCF(n, m) def add_fractions(Frac1, Frac2): denom1 = Frac1[1] denom2 = Frac2[1] Frac1 = Frac1[0] * denom2 Frac2 = Frac2[0] * denom1 return reduce_fraction(Frac1+Frac2, denom1 * denom2) class Fraction: def __init__(self, numerator, denominator = 1): self.fraction = reduce_fraction(numerator, denominator) def __str__(self): return str(self.fraction[0]) + '/' + str(self.fraction[1]) __repr__ = __str__ # 関数を別の関数に代入 # これはpythonでは合法です。str__を __repr__ にリネームしただけです。 def __add__(self, other_object): if isinstance(other_object, int): # if other_object is an integer return self + Fraction(other_object) # Fractionクラスにする # (整数は分母が1の分数に過ぎない!) if isinstance(other_object, Fraction): return add_fractions(self.myFrac = Fraction(6, 4) # 6/4の分数、3/2に縮小される other_Frac = Fraction(2,3) print(myFrac + other_Frac, '\n') print(myFrac + 2)
出力
13/6 7/2 -
引き続き見て回ろう。この記事は、クラスができることのほんの表面をなぞったに過ぎない。どんな質問にも答えてくれるもう一つの素晴らしいリソースは.にアクセスしてクラスを書いてみてください。
コメント
最新を表示する
NG表示方式
NGID一覧