2016-05-16 1 views
0

I持っ印刷引数の次のスタンドアロン機能:機能3.5

def multiArgsPrinter2(*args): 
    testString = ''; 
    for count, thing in enumerate(args): 
     testString += str(thing) + "," 

    return testString 

どの次のように実行すると:

retval = multiArgsPrinter2(20, 30, 40) 
print(retval) 

は20,30,40、 - 期待どおりに印刷します。私は、内部のこの機能を持つクラスを作る:

class TestHelper2: 
    """The TestHelper Class""" 

    def multiArgsPrinter3(*args): 
     testString = ''; 
     for count, thing in enumerate(args): 
      testString += str(thing) + "," 

     print(testString) 
     return testString 

私は私はこのようなルックスを取得し、出力、戻り値として、またはクラス内のいずれか、この結果を印刷どんなに:

<TestHelper2.TestHelper2 object at 0x00F6ABB0>,20,30,40, 

ました私を困惑させる。私が把握していないものの手がかりは?

オブジェクト内の別の関数を呼び出す際に、戻り値の前後に括弧()を付ける習慣があるのであれば、

+2

あなたのボーナスポイントの質問に関しては、それはあなたが意味するものの例とは別の質問であるべきです。それがそうであるように、私はあなたが話していることを知らない。 –

+0

私は「ボーナスポイント」の問題を解決しました。私は誤ってアスタリスク(*)を付けずに、別のメンバ関数に 'args'変数を渡しました。これは基本的にリストとして残して、最終的に出力時にかっこを生成します。 – Gazoo

答えて

2

クラスで定義されている関数は、デフォルトでインスタンスメソッドです。つまり、クラスのインスタンスが暗黙的に渡され、関数シグネチャにはそれが反映されます。例えば:

class Example: 
    def print_stuff(self, *args): 
     print 'My *self* is {}'.format(self) 
     print 'My *args* is {}'.format(args) 

Example().print_stuff(1, 2, 3) 
# My *self* is <__main__.Example instance at 0x012D4210> 
# My *args* is (1, 2, 3) 

Pythonはクラス、staticmethodclassmethod内部に定義された関数の署名を変更するために、2つのデコレータを提供します。それらはデコレータ構文(このレスポンスの範囲外)で最もよく使用され、関数を引数として受け入れ、変更された新しい関数を返す関数です。

staticmethodは、暗黙のself引数をクラス内の関数から削除します。

class Example: 
    @staticmethod 
    def print_stuff(*args): 
     # No more self... 
     print 'My *args* is {}'.format(args) 

Example().print_stuff(1, 2, 3) 
# My *args* is (1, 2, 3) 

staticmethodの仮想的な実装は次のようになります。

def staticmethod_example(func): 
    def wrapper(self, *args, **kwargs): 
     return func(*args, **kwargs) # Notice how *self* is thrown away 
    return wrapper 

classmethodは、関数からの暗黙のself引数を削除し、代わりに引数としてインスタンスクラスを追加します。

class Example: 
    @classmethod 
    def print_stuff(cls, *args): 
     print 'My *cls* is {}'.format(cls) 
     print 'My *args* is {}'.format(args) 

Example().print_stuff(1, 2, 3) 
# My *cls* is __main__.Example 
# My *args* is (1, 2, 3) 

classmethodの仮想的な実装は次のようになります。

def classmethod_example(func): 
    def wrapper(self, *args, **kwargs): 
     return func(self.__class__, *args, **kwargs) # Substitute *cls* for *self* 
    return wrapper 

は、あなたの質問に答えるために、それは暗黙的にselfを渡されているので、あなたの関数呼び出しは、クラスのインスタンスを印刷しています。関数宣言の上にstaticmethodデコレータを追加すると、意図した通りに動作します。

+0

洞察力のある有用な答えをありがとう。私の考えは、私が思っていたよりもはるかに多くのPythonを公開しています。私は自分自身を再教育するのが適切だと思います。 – Gazoo

3

multiArgsPrinter3(*args)は、*argsの中にselfをキャッチしています。署名をmultiArgsPrinter3(self, *args)に変更するだけで問題ありません。サイドノートとして

class TestHelper: 
    """"The TestHelper Class""" 
    def multi_args_printer(self, *args): 
     test_string = '' 
     for thing in args: 
      test_string += str(thing) + "," 
     print(test_string) 
     return test_string 

print(TestHelper().multi_args_printer(20, 30, 40)) # Prints "20,30,40," 

、あなたは末尾のカンマをしない限り、あなたはjoinを使用する必要があります。例えば、','.join(map(str,args))

+1

staticメソッドなので、 'staticmethod'にする方が良いでしょうか?暗黙的にインスタンスを渡すバインドされたインスタンスメソッドについての詳細な説明が必要な場合がありますが、インスタンスを使用しないインスタンスメソッドを持つのは変です。 –

+0

@JaredGoguen確かに、これがプロダクションコードだったら。それは、私はOPをデコレータやその他のものと混同したくありません。 –

+1

'join 'は' join'の代わりに 'join 'を使うべきです。join(map(str、args))' join'は文字列でないものの自動変換を行わないので、 – Copperfield

関連する問題