在python中返回值的类定义

2024-06-02 17:07:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我定义了一个类

在代码.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()

我希望在调用类时返回sum,而不是在方法id调用时返回?在

我要如何编码


Tags: 方法代码pytestselfid编码return
3条回答

您可以重写^{}

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

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

这就是说,我怎么强调也不为过,这样做是多么的毫无意义,或多或少总是这样。在

当我们没有意义的时候,你也可以让sum()作为一个方法:

^{pr2}$

但是,在__new__实现之外无法访问它。或者不创建一个test实例“硬道”,通过手动调用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要简单得多!如果你不介意的话,我现在去喝一杯。在

虽然不可能从构造函数返回任何值,但可以使用__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

为此使用函数:

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

或者更好,只需使用内置:

^{pr2}$

如果您有充分的理由想要这样做,您可以随时将这些东西包装在另一个函数中:

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

相关问题 更多 >