我如何更改uuu init_uuuu返回的内容?

2024-04-25 10:25:51 发布

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

class Foo:
    def __init__(self, *args, **kwargs):
        ...
    def some_method(self):
        ...
        return something

我有这个示例类。我想做的是,当我创建一个实例时,它应该立即返回一个特定方法的结果

我知道我可以通过Foo().some_method()来做到这一点,但是否有任何方法可以通过创建一个实例来做到这一点

我试着这么做

class Foo:
    def __init__(self, *args, **kwargs):
        ...
        return self.some_method()
    def some_method(self):
        ...
        return something

但是它说TypeError: __init__() should return None, not 'object()'


Tags: 实例方法self示例returnfooinitdef
2条回答

__init__方法实际上并不返回新实例;当您通过写入Foo()来构造对象时,您不是直接调用__init__,而是调用__new__,而__new__方法通过调用__init__来初始化实例。因此,您可以通过覆盖__new__来更改Foo()返回的内容:

class Foo:
    def __new__(cls):
        obj = super().__new__(cls)
        obj.__init__()
        return obj.some_method()
    def __init__(self):
        self.x = 5
    def some_method(self):
        return self.x * 2

print(Foo()) # 10

或者,您可以使用类装饰器将Foo替换为创建实例、调用方法并返回结果的函数:

from functools import wraps

def autocall(cls):
    @wraps(cls)
    def wrapped():
        obj = cls()
        return obj.some_method()
    return wrapped

@autocall
class Foo:
    def __init__(self):
        self.x = 5
    def some_method(self):
        return self.x * 2

print(Foo()) # 10

也就是说,只编写一个helper函数几乎总是更好的,这样类Foo仍然可以以正常的方式用于其他目的(例如测试):

class Foo:
    def __init__(self):
        self.x = 5
    def some_method(self):
        return self.x * 2

def foo_helper():
    obj = Foo()
    return obj.some_method()

print(foo_helper()) # 10

由于无法从构造函数返回任何内容,因此可以使用类似于factory模式的内容:

class Creator:

    def __init__(self, factoryClass):    
        self.factoryClass = factoryClass
    
    def makeMethod(self):
        return self.factoryClass

class FactoryInterface:
    def __init__():
        pass
    def factoryMethod():
        pass

class Factory1(FactoryInterface):
    def __init__():
        pass

    def factoryMethod():
        print("Factory1 method is called.")          

class Factory2(FactoryInterface):
    def __init__():
        pass

    def factoryMethod():
        print("Factory2 method is called.")                      

factoryCreator = Creator(Factory1)
newFactory = factoryCreator.makeMethod()
newFactory.factoryMethod()

factoryCreator = Creator(Factory2)
newFactory = factoryCreator.makeMethod()
newFactory.factoryMethod()

打印出:

Factory1 method is called.
Factory2 method is called.

相关问题 更多 >