SUPPORT UKRAINE
- Your indifference to the act of cruelty can thrive rogue nations like Russia -
を参考にしているブログ一覧
【 Effective Python, 2nd Edition 】__getattr__、__getattribute__、__setattr__ メソッドを利用して、事前に定義していないインスタンス属性を操作しよう!
Published 2020年7月18日11:07 by mootaro23
データベースのレコードに対応する Python クラスを考えます。
このとき、クラスの各属性はレコードの各フィールドに対応していますね。
つまり、前もって対象とするテーブルの構造が分かっていなければそれに対応するクラスなんか作れないよ、ということです。
ところが Python では「えっ、前もって分からないの?それじゃしょうがないからとにかく始めちゃって分かったら追…
【 Effective Python, 2nd Edition 】デスクリプタ ( descriptor ) を利用して @property で行っていた属性値への操作を再利用できるようにしよう!
Published 2020年7月16日21:55 by mootaro23
@property は属性値のちょっとした操作、変更に非常に便利ですが、最大の問題点は再利用性です。
当然ながら @property のメソッドの対象はクラス内のただ1つの属性であって、複数の属性に同じ操作を適用することはできませんし、ましてや、異なるクラスで再利用することなどできません。
例えば、生徒が宿題の自主採点をして提出するためのクラスを作成し、入力された点数が 0 …
【 Effective Python, 2nd Edition 】クラス作成時の setter メソッド、getter メソッドの利用は最小限に。可能な限り public 属性によるインターフェース構築を目指しましょう
Published 2020年7月15日21:14 by mootaro23
他の言語の使い手が Python を使うときに良くありがちなのが、クラスを定義する際に明示的に setter メソッドと getter メソッドを実装することです。
class OldHowManyCanIBuy:
def __init__(self, price):
self._price = price
def get_price(self…
【 Effective Python, 2nd Edition 】独自のコンテナタイプ ( custom container types ) を定義するなら collections.abc クラスから派生させると手間無しです!
Published 2020年7月14日17:51 by mootaro23
シーケンス ( sequences ) データを扱い、もしちょっとだけ独自の機能を追加したいのなら、組み込みのリストタイプ ( list ) から派生させたクラスを作っちゃえば簡単です。
通常のリストに、要素の出現頻度をカウントする機能を追加してみました。
class FrequencyList(list):
def __init__(self, members):…
【 Effective Python, 2nd Edition 】Python においてクラス属性に厳密な private が無いのは何故? できる限り利用すべきではない理由とは? それでも private の使用が有効な状況とは?
Published 2020年7月13日20:17 by mootaro23
Python におけるクラス属性へのアクセスは基本 public ですが、属性名の前に __ ( _ を2つ) 付けることで private にすることができます。
class MyObject:
def __init__(self):
self.public_field = 5
self.__private_field = 10
…
【 Effective Python, 2nd Edition 】@classmethod ポリモーフィズム ( polymorphism ) を利用して、複数の派生クラスをよりジェネリック ( generic ) に活用しよう!
Published 2020年7月8日23:11 by mootaro23
Python では、インスタンスに限らずクラスでもポリモーフィズム ( polymorphism ) を活用できます。
これはどういうことなんでしょうか? そして、どんなときに活用できるんでしょうか?
Polymorphism は、クラス階層内におけるそれぞれの派生クラスが、同じインターフェースながら機能的には異なる独自のものを提供することを可能にします。
今回目指すのは …
【 Effective Python, 2nd Edition 】クラスインスタンスを関数として利用可能にする __call__ 特殊関数を含んだクラスを定義してフック ( hook ) として利用することで、既存の API の機能拡張を計ろう!
Published 2020年7月7日20:57 by mootaro23
数多くの Python 組み込み API では、引数として関数を受け取ることでその「振る舞い」をカスタマイズできるようになっています。
このようなことをフック ( hook ) と呼んでいますが、定義には若干曖昧なところが見受けられ、「API の振る舞いを渡す関数によってカスタマイズする」行為そのものを指す場合や、API の振る舞いをカスタマイズするために渡す「関数自身」を指す場合等が…