タグ

pythonとoopに関するcu39のブックマーク (5)

  • 紹介マニアどらふと版: Python の __new__ や __init__ はコンストラクタではない

    概要 結構 Python の「__new__」や「__init__」をコンストラクタと記述する人がいるが、厳密にはコンストラクタではない。 コンストラクタの定義 コンストラクタの定義は「Constructor (object-oriented programming) - Wikipedia, the free encyclopedia」や「コンストラクタ - Wikipedia」を見るのが良いかもしれない。 コンストラクタの定義は、厳密には以下だと思われる。 オブジェクトを生成する またオブジェクトの生成とは以下を示す。 allocation(メモリ割り当て) initialization(初期化) 「コンストラクタ」はオブジェクト生成のために呼ばれる物の事を指すので、全ての最初に呼ばれる物を指す。 「__new__」と「__init__」がコンストラクタでないことの証明 以下は「__

  • RSpecでprivateメソッドをテストする

    Object#send(send)ならメソッドの呼び出し制限に関わらずメソッドを呼び出すことが可能なので、privateメソッドもテスト可能。 確か、1.9以降はメソッド呼び出し制限がObject#sendにも影響するとどこかで見た記憶があるのだけど結局そうはなっていないみたい。 1.9.1、1.8.7で確認済み。 ちなみにオマケ。 Pythonはメソッド名の前にアンダースコアを2つけるとprivateなメソッドになるのだけれど、実際のところ別名でメソッドを定義してそちらを呼び出してるっぽい。別名で定義された方はprivateではないので、そちらを呼び出してテストすることが可能。 他にもJavaだったらsetAccessible(True)を実行すればpublicなメソッドに変更されるのでテスト可能。と聞いただけで確認はしていない。

    cu39
    cu39 2012/09/20
    instance.send(:method_name, arg)
  • 和訳 : なぜPythonのメソッドに明示的にselfと書かねばならないのか

    みんなのIoT/みんなのPythonの著者。二子玉近く160平米の庭付き一戸建てに嫁/息子/娘/わんこと暮らしてます。月間1000万PV/150万UUのWebサービス運営中。 免責事項 プライバシーポリシー Pythonの生みの親Guidoパパのブログエントリを翻訳してみました。「Why explicit self has to stay - なぜPythonのメソッド引数に明示的にselfと書くのか」。Pythonのメソッド引数に書く「self」はしばしば,他言語からのPython移民を中心に「ウザイ」「キモイ」「消えてなくなれ」と攻撃の対象となることが多いのです。GuidoパパはPythonが生まれて10年,もう何度も似たようなことを聞かされ,そのたびに明快な反論を行ってきました。言語の設計者には,技術的な素養はもちろんのこと,情熱と根気,そして我慢強さが必要なんだなあとつくづく思い知

  • 第2回 abcモジュールによる抽象基底クラスの作成 | gihyo.jp

    抽象クラスとインターフェース C++には、抽象クラスという仕組みがあります。 抽象クラスとは、インターフェースのみを定義した純粋仮想関数というメンバ関数をもつクラスです。抽象クラスはそのままでは定義が完全ではないため、継承して純粋仮想関数をすべてオーバライドしなければインスタンスを作れません。 このような抽象クラスを用いることは、クラスのインターフェースを定義し、継承時にオーバライドしてほしいメンバ関数を明示する、という意味があります。 Python においては、そのようなインターフェースのみを定義するという機能が存在しません。そのため、クラスを継承する際にオーバライドするべきメソッドを明示し、オーバライドされていなければインスタンスを作れなくする、というような挙動をさせることは通常できません。 似たような挙動をさせるには、 未実装であることの印としてNotImplementedオブジェク

    第2回 abcモジュールによる抽象基底クラスの作成 | gihyo.jp
  • Python のクラスシステム

    1. 初めに この文書の目的は、 Python で自前の class を作るとき、メソッドの第一引数がそのクラスのインスタンスそれ自身 (一般に self と書かれる) であることの理由を説明することです。 他の言語ではメソッドを定義するときに第一引数をインスタンスにするという方法は取り入れておらず、 this などの予約語を使ってインスタンスを表すのが一般的です。 Python だけが、独自の流儀をとっています。 しかし、このことを説明したサイトは見当たりませんでした。 どのサイトもそれは決まりごとだで済ませてしまっています。 しかし、それではどうも Python のクラスシステムを理解した気になれないので、Python でクラスシステムが どのように実装しているか推測しながら、例の self について説明したいと思います。 2. オブジェクト指向プログラミングの復習 オブジェクトとは、

  • 1