-3

クラスを定義しました

コード.py

class test:
     def __init__(self.x,self.y):
       self.x = x
       self.y = y


    def sum(self):
      z = self.x + self.y
      return z

def main():
   x = test(1,2)
   valsum = x.sum()

メソッドIDが呼び出されたときではなく、クラスが呼び出されたときに合計を返したいですか?

どのようにコーディングしますか

4

3 に答える 3

3

オーバーライドできます__new__():

class test(object):
    def __new__(cls, x, y):
        return x+y

z = test(1, 2)
print z # => 3

そうは言っても、多かれ少なかれ常にそうすることがどれほど信じられないほど無意味であるかを十分に強調することはできません.

sum()無意味ですが、メソッドにすることもできます。

class test(object):
    def __new__(cls, *args, **kwargs):
        test_obj = super(test, cls).__new__(cls)
        test_obj.__init__(*args, **kwargs)
        return test_obj.sum()

    def __init__(self, x, y):
        test.x = x
        test.y = y

    def sum(self):
        return self.x + self.y

z = test(1, 2)
print z

ただし、__new__実装の外部からアクセスする方法はありません。または、手動でandtestを呼び出して「難しい方法」でインスタンスを作成せずに、その時点でスーパーバイザーの手による暴力が正当化されます。object.__new__()__init__

倒錯を最大限にするために、ここに@kindallの提案されたバリアントがあります – もちろん、不必要にオーバーエンジニアリングされています:

メタクラスで

class meta_delegate(type):
    def __call__(cls, *args, **kwargs):
        obj = cls.__new__(cls)
        obj.__init__(*args, **kwargs)
        delegate = cls.__delegate
        if (isinstance(delegate, basestring)):
            delegate = getattr(obj, delegate)
            return delegate()
        else:
            return delegate(obj)

    @staticmethod
    def to(delegate):
        def __new__(*args, **kwargs):
            cls = meta_delegate(*args, **kwargs)
            cls.__delegate = delegate
            return cls
        return __new__

class test(object):
    def __init__(self, x, y):
        test.x = x
        test.y = y

    def sum(self):
        return self.x + self.y

    __metaclass__ = meta_delegate.to(sum)

私は実際にそれが機能することに正直に驚いています。メタクラスを呼び出すと、その__call__.

そして最後に、すべてがまったく無意味であることを説明するためだけに:

無意味すぎて円形

class meta_delegate(type):
    def __call__(cls, *args, **kwargs):
        return cls.__delegate(*args, **kwargs)

    @staticmethod
    def to(delegate):
        def __new__(*args, **kwargs):
            cls = meta_delegate(*args, **kwargs)
            cls.__delegate = staticmethod(delegate)
            return cls
        return __new__

class test(object):
    __metaclass__ = meta_delegate.to(lambda x, y: x+y)

ここでのデリゲートは任意の呼び出し可能にすることができ、API ははるかに単純です! 失礼しますが、飲みに行きます。

于 2012-10-12T17:26:07.037 に答える
3

これには関数を使用します。

def test(*args):
    return sum(args)

または、組み込みを使用するだけです。

sum((1,2))

これが必要な正当な理由がある場合は、いつでも別の関数でこれをラップできます。

def testsum(a,b):
    t = test(a,b)
    return t.sum()

または、次のようにすることもできます。

result = test(a,b).sum()

直接。ただし、これは非効率的であるため、控えめに使用する必要があります...


最後に(コメントで指摘されているように、オーバーライドすればこれを行うことができますが、これをしない__new__ください

class test(object):
    def __new__(cls,*args):
       return sum(*args)

print (test(1,2,3,4)) #10
于 2012-10-12T17:13:47.803 に答える
1

コンストラクターから値を返すことはできませんが、__call__マジックメソッドを使用してオブジェクトを直接呼び出し可能にすることができます。

class Sum:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __call__(self):
        return self.x + self.y

x = Sum(4,7)
x() # = 11
于 2012-10-12T17:18:04.700 に答える