2

クラス内のメソッドを使用して、クラスの複数のオブジェクトを返すことができるようにしたいと考えています。このようなもの。

class A:
    def __init__(self,a):
    self.a = a

    def _multiple(self,*l):
        obj = []
        for i in l:
            o = self.__init__(self,i)
            obj.append(o)
        return obj

これを iPython (iPython 0.10 および Python 2.6.6) で実行すると、次のようになります。

In [466]: l = [1,2]
In [502]: A._multiple(*l)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

TypeError: unbound method _multiple() must be called with A instance as 
first argument (got int instance instead)

呼び出しと「self」キーワードの使用法については、はっきりとわかりません。これを正しくするのを手伝ってもらえますか?

ありがとうございました。

4

3 に答える 3

3

TypeError: バインドされていないメソッド _multiple() は、最初の引数として A インスタンスを使用して呼び出す必要があります (代わりに int インスタンスを取得しました)

エラーは自明です。これは、インスタンス メソッドが Class メソッドとして呼び出されていることを意味します。インスタンス メソッドをクラス メソッドとして作成するには、デコレータを追加します。@classmethod

>>> class A:
    def __init__(self,a):
        self.a = a
    @classmethod
    def _multiple(cls,*l):
        #Create multiple instances of object `A`
        return [A(i) for i in l]

>>> l = [1,2]
>>> A._multiple(*l)
[<__main__.A instance at 0x066FBB20>, <__main__.A instance at 0x03D94580>]
>>> 
于 2013-01-30T09:37:28.560 に答える
1

クラスメソッドが必要です:

class A:
    def __init__(self,a):
        self.a = a

    @classmethod
    def _multiple(cls,*l):
        obj = []
        for i in l:
            o = cls(i)
            obj.append(o)
        return obj


>>> A._multiple(1, 2) # returns 2 A's
[<__main__.A instance at 0x02B7EFA8>, <__main__.A instance at 0x02B7EFD0>]

classmethodデコレーターは、通常のself最初のパラメーターをクラスへの参照 (この場合はA) に置き換えます。このようにすると、サブクラスを作成してサブクラスAを呼び出す_multipleと、代わりにサブクラスが渡されることに注意してください。

class B(A): pass

>>> B._multiple(1, 2, 3)
[<__main__.B instance at 0x02B87C10>, <__main__.B instance at 0x02B87D28>, <__main__.B instance at 0x02B87CD8>]

オブジェクトのリストを作成しBます。

于 2013-01-30T09:36:56.183 に答える
0

単純に置き換えます:

 self.__init__(self, i)

と:

 A(i)

この理由は、init メソッドが呼び出されたオブジェクトを変更し、「self」が現在のインスタンスであるためです。コンストラクター (クラスと同じ名前) を使用して、新しいインスタンスを作成します。

于 2013-01-30T09:36:30.357 に答える