2017-01-09 3 views
3
class A: 

    def __init__(self, text): 
     self.printStats() 
     A.printStats(text) 

    def printStats(self): 
     print(self) 

a = A("Hello") 

この版画:自己とクラス名のメソッドの呼び出しの違いは?

<A object at 0x7f47e2f08ac8> 
Hello 

はなぜこの(A.printStats(text))である可能性?私は何が起きているのかを理解しています(self参照text)が、私はなぜそれを理解できません。

+3

'self.instance_method()'は 'Class.instance_method(self)'に相当します。メソッドが実際にインスタンス状態(例えば 'self'のアクセス属性)を使用していない場合は、何かを渡すことができます。 – jonrsharpe

+1

'print'の' self'引数として 'text'(あなたの例では" Hello "です)を渡しています。これは本当にあなたがすべきことではありません。しかしそれが「こんにちは」と表示されている理由です。 – Tagc

+0

良いスペルと文法の最初の質問をありがとう!どのくらい多くの低品質の最初の投稿があるのか​​わからない... –

答えて

1

あなたはクラスのインスタンスを作成します。

a = A('some text') 

self引数はaに恒久的に結合するようになる、これはクラスの背後にある魔法です。 a.printStats('something')を試すと、self引数がすでにaで占有されているため、エラーが発生します。 a.printFunction.__func__で非結合自己を持つ元の関数を回復することができます。試してみてください。a.printFunction.__func__('this will be self argument')

ただし、インスタンスを作成しないと、バインドするものは何もありません。selfには、まだselfが使用可能です。そのような場合は、Aを単純な辞書保持関数として扱うことができます。

A = {'__init__': someInitFunction, 
    'printStats': printStatsFunction} 

あなたは名前selfが任意であることを覚えておく必要があり、あなたは、代わりにさえnot_selfを任意の単語を使用することができます。

4
A.printStats(text) 

AのインスタンスでprintStatsを呼び出すことはありません。これは文字列で呼び出されます - selfは渡されません。

def printStats(self): 
    # <--- here, "self" if the string "Hello", not an instance of A. 
    print(self) 

A.printStats(self)self.printStatsに相当します。同様に関数がある場合printStatsWithPrefix;

あなたはA.printStatsWithPrefix(self, prefix)を実行する必要があります。スタイルの


注: Pythonの大会(PEP 8)することで、あなたは、関数名にlowercase_with_underscoresを使用する必要があります。

+0

あなたの説明をありがとう。 「文字列で呼び出す」とはどういう意味ですか?編集:気にしない、それを得た。 – d9h

+0

@ d9h "呼び出し"は、指定されたパラメータで関数を実行することを意味します。あなたは関数を実行し、 'self'を' A'のインスタンスとして使用する代わりに、文字列を使用しました。 –

+0

あなたが役に立ったと思ったら受け入れることを忘れないでください! –

1

クラスを介してメソッドを呼び出すときに、クラスの最初の引数が実際にクラスのインスタンスである必要があるため、コードはPython 2で失敗します。

Python 3では、最初の引数がクラスのインスタンスに関連する必須のインタフェースを実装することしか期待されていないため、実装はそれほど厳密ではありません。パラメータがインスタンスかどうかのチェックは行われません。そして、実際にはでインスタンスメソッド/変数にアクセスしているわけではないので、これは動作し、単に渡された文字列'hello'を出力します。

関連する問題