1

を使用していくつかのコンストラクターを実装して@classobjいます。変数を設定するだけでなく、新しいクラスでメソッドも呼び出しています。

class Example:
    def __init__(self):
        pass

    @classmethod
    def constructor1(cls,x,y):
        self=cls
        self.__x = x
        self.__somemethod(self,y)

    ...

次のエラーが表示されます。

unbound method __somemethod() must be called with Example instance as 
first argument (got classobj instance instead)

この問題を解決するにはどうすればよいですか?

4

4 に答える 4

3

クラスメソッドをコンストラクターにしたい場合は、おそらく として渡されたクラスのインスタンスを作成したいと思うでしょうcls。行でそれを行おうとしていると思われますself = clsが、括弧を入れ忘れたため、実際には新しいインスタンスを作成していません。他にもいくつか問題がありますが、それが重要な問題だと思います。固定コンストラクターは次のとおりです。

@classmethod
def constructor1(cls,x,y):
    self=cls()                # parentheses added, to make it a call
    self.__x = x
    self.__somemethod(y)      # self is not needed as a parameter here
    return self               # return the new instance
于 2012-09-29T10:42:32.203 に答える
2

__somemethodクラスメソッドではなく、「通常の」メソッドのようです。また、通常のメソッドは、クラスではなく、実際のインスタンスを最初のパラメーターとして想定しています。そして、constructor1は として装飾されているため@classmethodclsはクラスそのものです。これを に渡します__somemethod。それはうまくいきません。

設計アプローチを再考する必要があります。

補遺:

たぶん、あなたはこのようなことを意味しましたか?

@classmethod
def constructor1(cls, x, y):
    newinst = cls()
    newinst.__x = x
    cls.__somemethod(newinst, y)

ただし、次のように記述したほうがよいでしょう。

@classmethod
def constructor1(cls, x, y):
    newinst = cls()
    newinst.__x = x
    newinst.__somemethod(y)

実際、私はより近しいアプローチが好きです - 私には複雑すぎるコードの匂いのように思えます。

于 2012-09-29T10:30:01.473 に答える
1

これは、あなたが達成しようとしていると私が思うもののテンプレートかもしれません...

import random

class Something(object):
    def __init__(self, value, **kwargs):
        self.value = value
        for k, v in kwargs.iteritems():
            setattr(self, k, v)
    @classmethod
    def from_iterable(cls, iterable):
        return cls(sum(iterable), description='came from from_iterable')
    @classmethod
    def make_random(cls):
        return cls(random.randint(1,1000), is_random=True)

a = Something.from_iterable([1, 2, 3])
b = Something.make_random()
c = Something(56)

for obj in (a, b, c):
    print type(obj), obj.value

<class '__main__.Something'> 6
<class '__main__.Something'> 308
<class '__main__.Something'> 56
于 2012-09-29T10:41:00.430 に答える
1

ch3ka の回答と Tim Pietzcker のコメントのおかげで、エラーが見つかりました: http://jjinux.blogspot.co.at/2008/11/python-class-methods-make-good.htmlのファクトリ メソッドを使用し、()行でself=cls()。今では問題なく動作します:

class Example:
    def __init__(self):
        pass

    @classmethod
    def constructor1(cls,x,y):
        self=cls()
        self.__x = x
        self.__somemethod(self,y)

    ...
于 2012-09-29T10:41:20.807 に答える