• 締切済み

pythonのクラスのメンバー関数の呼び出し

pythonの教科書を見ながら実習しているのですが、1つ不明なことがあり、お尋ねします。 クラスに属するメソッドについてです。以下の3つのパターンが出てきました。 1 __init__ 2 __xxx 3 __で始まらないもの。 この3つのうちで、 1はコンストラクタのようで、オブジェクトを定義したときの初期値設定みたいで、 3は普通のメソッドであり、オブジェクト.メソッド()で呼び出すようです。 2はマングリング機能でオブジェクトから呼び出すことができないということでした。 では、いつ呼び出されるのかという疑問があります。 オブジェクトのメンバー関数が呼ばれるたびにその都度実行されるということでしょうか。 本に明記されていないので、解説をよろしくお願いします。

  • Python
  • 回答数1
  • ありがとう数0

みんなの回答

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.1

python ネームマングリング で調べてみてはいかがでしょうか。

関連するQ&A

  • Python のクラスのメンバ変数

    class foo( object ):        __result = []        def __init__( self, n, m ):       # self.__result = []       self.__result.append( n + m )    def func( self ):       print self.__result[0] hoge = foo( 1, 2 ) fuga = foo( 3, 4 ) hoge.func() # 3 fuga.func() # 3 ... !? 数値や文字列といったメンバ変数は、コンストラクタで意図的に初期化してやらなくても正常な値になりますが、それ以外のオブジェクトや配列だと fuga は hoge のメンバと同じものになってしまいます。他の言語の感覚ですと、__result は foo のメンバな上にプライベートなので、fuga の __result が hoge.__result を指すのは考えられない事なのですが、この書き方がマズいのでしょうか。 また、もしこのようになっている理由等もありましたら、併せてお教えください。

  • クラスの継承の仕方

    後学のため、JavaScriptについて勉強しています。 JavaScriptでもクラス(のようなもの)を定義してオブジェクトを作成できるようですが、サブクラスを定義する方法が分かりません。メソッドやコンストラクタはどのように継承すればよいのでしょうか。 お分かりの方おられましたら、ご教授のほどお願い致します。

  • Pythonで属性とは?

    プログラミング初心者です、よろしくおねがいします 自分でも調べたのですが初心者すぎて用語が難しく解らないところが多くはっきりしないので教えてください。 Pythonでいうオブジェクト、メソッド、属性の違いはなんですか? 私の今の所の知識では オブジェクト=クラスやメソッドやクラス変数 メソッド=クラスの中に有る関数 属性=クラスの中にある関数や変数など じゃ、オブジェクトと属性の違いってなんなの?ということに 以下の例題でA objects are given a color attribute of "white"とあります attribute=属性ですよね? つまり属性とはインスタンス変数の中身のことなの? class A(object): ....def __init__(self): ........self.color = "white" word = A() print(word.color) 有識者の方々にはくだらなすぎる疑問かも知れませんがよろしくおねがいします

  • 参照メンバを持つクラス

    ClassAとClassBにCMyDataオブジェクトを渡したいのですが、メモリ上に同じデータのコピーを作りたくないので、コンストラクタがCMyDataの参照を受け取る設計にしました。こうすることで、CMyDataの実体はメモリ上に1つしか存在しないことになります。 ただ、クラスが、自身が管理していない外部領域にあるデータへの参照を使って仕事をするというのに違和感を感じます。 完全コンストラクタというデザインパターンがあって、クラスのインスタンスを生成する時に必要な全てのデータを渡すのが正しい流儀だそうです。 しかしこのClassA(B)の設計では、ClassA(B)の寿命が終わるまで参照先のデータが生きているとは限りません。もっといい設計はないでしょうか?ちなみにCMyDataは実際にはかなり大きなデータで、一時的であってもコピーを複数持ちたくないのです。ClassAとClassBは、実際は他のデータも参照するため1つのクラスにはしたくないのです。 class CMyData { // 色々なデータ }; class CMain { CMyData* myData; // ファイルからデータを読み込んで生成 ClassA* objA; ClassB* objB; void ReadFile() { myData = new CMyData(); // ファイルからデータを読み込みCMyData構築 } void Init() { ReadFile(); objA = new ClassA(*myData); // 自身のメンバ変数の参照でClassAを構築 objB = new ClassB(*myData); } void DoProcess() { Init(); // 実行は一度だけ objA->hoge(); // ClassAに仕事をさせる objB->foo(); // ClassBに仕事をさせる } } class ClassA { CMyData& m_data; public: ClassA(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void hoge(); } class ClassB { CMyData& m_data; public: ClassB(CMyData& data) m_data=data; // CMyDataオブジェクトを参照で受け取る void foo(); }

  • クラス継承 メンバ引継ぎとprivateについて

    「クラス継承時のメンバ引継ぎの意味」と、 「privateでオーバーライドさせた際の挙動」ついて教えてください。 class Pa{  private $level="10";  public function getLevel(){   return $this->level;  } } class Ch extends Pa{  protected $level="5"; } $ch = new Ch(); echo $ch->getLevel(); このとき、$ch->getLevel();は、 Paクラスのメソッドをchオブジェクトで見に行ってるのでしょうか? それとも、Chクラスに引き継がれたメソッドを見に行っているのでしょうか? また、このときの「$this」「$this->level」は、それぞれ何を意味しているのでしょうか? また、このときの、Chクラスの「$level」は、どういう状態(扱い)になっているのでしょうか? エラーにならないのですが、再定義扱いされないのでしょうか? 新定義扱いされてるってことでしょうか? 「privateメンバを継承した際」、どういう動きをするのか(ルールになっているのか)教えてください。

    • ベストアンサー
    • PHP
  • thisキーワードについて確認

    下記の確認事項が正しいかどうか、yesかNoかで判定してくださいましたら幸いです。 確認1:thisは、現在実行中のオブジェクト自身をあらわす参照型変数。 確認2:『インスタンスメソッドやコンストラクタから他のメソッドやメンバ変数を参照する場合、 オブジェクト変数を指定せず参照することができるが、それは、インスタンスメソッド、コンストラクタは現在のオブジェクトを表すthisを持っているため。単純名で参照されているインスタンスメンバは、 実はコンパイラによりthis.単純名に変換されている。 クラスメソッドは個々のオブジェクトに属さないため、メソッド内にthis を持っていないので、thisは使えない。』

    • ベストアンサー
    • Java
  • Python3でのメタプログラミングについて

    下記の Ruby スクリプトと同じことを Python で行う場合、どのように実装すればいいでしょうか? <前提> ・メソッドを Klass クラスに実行時に動的に追加する。 ・追加したメソッドの動的削除、変更は必要ない。 ・メソッド定義は、Python のオブジェクトではなく単なる文字列。 ・メソッド内部から Klass クラス内のインスタンス変数にアクセスする。 ・Klass クラスや Klass インスタンスを扱う処理から、動的に追加したメソッドを呼び出す。 ・追加したメソッドはシングルトンメソッドである必要はない。 <目的> Klass クラスのカスタマイズ機能をメソッド定義文として外部に保存しておいて、実行時に呼び出して機能を拡張するような目的です。Klass クラスはめったに変更されないもの、カスタマイズ機能(メソッド定義文)はよく変更されるもの、という切り分けをしたいため、単純に多重継承や MixIn はしたくないです。(上手い方法があればいいのですが…) #!/usr/bin/env ruby # coding: utf-8 # 文字列のメソッド定義 $user_funcs = [' def user_foo() puts "foo" * @x end ', ' def user_bar() puts "bar" * @x end '] # ↑本来は文字列として外部DBに記録されている。 # ---- # # 拡張したいクラス # class Klass # インスタンス変数を持つ def initialize @x = 3 end attr_accessor :x # 文字列で定義されたメソッドを追加 $user_funcs.each do |f| eval f end end # ---- # # 呼出方法 # obj = Klass.new # 追加されたメソッド(user_から始まる名前)を列挙しながら実行する # => どんな定義がされていても、命名規則さえ守っていれば呼び出し側はそのメソッド名を知る必要はない。 obj.methods.select {|m| /^user_/ =~ m }.each do |m| eval "obj.#{m}" end # 追加されたメソッドはシングルトンメソッドではなく、あくまでもインスタンスメソッドである。 obj2 = Klass.new # インスタンス変数の書き換え obj2.x = 4 # インスタンスメソッドの書き換え def obj2.user_bar() puts "hoge" * @x end obj2.methods.select {|m| /^user_/ =~ m }.each do |m| eval "obj2.#{m}" end

  • jQueryのvar jQueryの仕組みについて

    jQuery-1.6.2のソースコードを見ているのですが質問させてください。 25行目の var jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context, rootjQuery ); }, そして100行めの jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { の意味が分かりません。 PHP等のclassになれているとJSのクラスは戸惑うことが多いのですが、この例は最たるもので、自分の中のJSでのclassは (1)スーパークラスのプロパティをcall()、apply()で継承 (2)スーパークラスのメソッドをprototypeオブジェクトで継承 (3)インスタンスのデータ型判定に必要なプロパティをconstructorで調整 だったのですが、スーパークラスがどの行のどれなのかも分かりません。 型やメソッド名からこれらがclassを意味しているのは分かるのですが、いったいどの部分がclass定義、継承を行っているのか教えていただけませんでしょうか? なぜこれらがclassになっているのかが理解できません。 分るのは、jQuery.prototype.constructor = jQueryで、それをjQuery.fnに代入((3))している事です。 329行目の、jQuery.fn.init.prototype = jQuery.fn;の右辺がnew {$class}の形であれば(2)のプロトタイプチェーンの形だと分るのですが。 (1)は、init内でメンバ変数を定義したりしているので、classなのかな、という程度しか分っておりません。 jQuery.fnがコンストラクタで、jQueryがインスタンスで、var jQueryは親クラスをinitしたもの?・・・と混乱しております。 質問内容も文章が混乱していて申し訳ないです。

  • pythonの本体処理の直前のifについて

    pythonのプログラム作法として、上から順番に、 1 拡張ライブラリの読み込み 2 関数、クラスの定義 3 処理の本体 と進むことが多い(必ずそうでなくてもいい)とのことです。 そして、3の"処理の本体"に入る前には、メインであることを確認する、以下のif文を入れる習慣とのことです。 if __name__ == '__main__': #メインのプログラムであるときに以下を実行する ここで質問ですが、この処理がメインである、ということはどこにも宣言しているわけではなく、処理の手順上自然にそうなってしまうわけですね。 C言語だったら、int main() というようなことになるし、Fortranだったら宣言と処理は見たらわかるわけです。 pythonのこのif __name__ == '__main__': は、何を問うているいるのでしょうか。__name__は変数なのでしょうか。 実際にコメントアウトしてインデントを調整したら、このif文がなしでも動作します。 例えば、クラスにおけるコンストラクタ __init__ のように __ がつくものはpythonのきまりなのだろうとは思いますが。 よろしくお願いします。

  • クラスを引数とする関数の明記の仕方と使い方について

    よろしくお願いします。 クラスを引数とする関数の明記の仕方と使い方について教えてください。 (1)以下のような関数があります。 long TEST::lib_new( const AA::Mess& mess、               AA::Mess *ret_mess) 第二引数のret_messを使用する場合は、 「ret_mess->XXX」の様に「->」で明記するのでしょうか? (2)以下のような関数があります。 double TEST::_new2( const AA::Mess& mess、                ABCD *abcd、                AA::Mess *ret_mess) また、上記ABCDが定義してあるヘッダファイルに、以下が明記されています。 class ABCD { public: ・・・・・ ・・・・・ ・・・・・ }   ABCDは構造体でなく、クラス定義されています。 クラスを引数としたい場合、関数の定義の第二引数は、「ABCD *abcd」でよいのでしょうか? 「ABCD::ABCD *abcd」にしなくてよいのでしょうか? また、abcdのメンバ関数を使用するには、「abcd->関数名称()」でよいのでしょうか? すみませんが、よろしくお願いします。

専門家に質問してみよう