2024-06-02 17:07:17 发布
网友
我定义了一个类
在代码.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调用时返回?在
我要如何编码
您可以重写^{}:
class test(object): def __new__(cls, x, y): return x+y z = test(1, 2) print z # => 3
这就是说,我怎么强调也不为过,这样做是多么的毫无意义,或多或少总是这样。在
当我们没有意义的时候,你也可以让sum()作为一个方法:
sum()
但是,在__new__实现之外无法访问它。或者不创建一个test实例“硬道”,通过手动调用object.__new__()和__init__,此时你在主管的手中遭受的任何暴力都是合理的。在
__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__。在
__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)
或者更好,只需使用内置:
如果您有充分的理由想要这样做,您可以随时将这些东西包装在另一个函数中:
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
您可以重写^{} :
这就是说,我怎么强调也不为过,这样做是多么的毫无意义,或多或少总是这样。在
当我们没有意义的时候,你也可以让
^{pr2}$sum()
作为一个方法:但是,在
__new__
实现之外无法访问它。或者不创建一个test
实例“硬道”,通过手动调用object.__new__()
和__init__
,此时你在主管的手中遭受的任何暴力都是合理的。在为了最大限度地减少变态行为,以下是@kindall建议的变体——当然是不必要的过度设计:
使用元类
我真的很惊讶它能起作用。似乎调用元类并没有使用它的
__call__
。在最后一个只是为了说明这一切毫无意义:
所以毫无意义这是循环的
这里的委托可以是任何可调用的,而且API要简单得多!如果你不介意的话,我现在去喝一杯。在
虽然不可能从构造函数返回任何值,但可以使用
__call__
魔术方法使对象直接可调用。在为此使用函数:
或者更好,只需使用内置:
^{pr2}$如果您有充分的理由想要这样做,您可以随时将这些东西包装在另一个函数中:
或者你可以这样做:
直接。这应该谨慎使用,因为它是低效的。。。在
最后(正如评论中指出的,如果重写
__new__
,不要这样做,可以这样做)相关问题 更多 >
编程相关推荐