在python中使用自定义初始化函数而不是`__init__`的好处

McL*_*nce 6 python oop initialization

我正在查看以下代码.

在许多情况下,该__init__方法并未真正使用,但有一个自定义initialize函数,如下例所示:

def __init__(self):
    pass

def initialize(self, opt):
    # ...
Run Code Online (Sandbox Code Playgroud)

然后将其称为:

data_loader = CustomDatasetDataLoader()
# other instance method is called
data_loader.initialize(opt)
Run Code Online (Sandbox Code Playgroud)

我发现如果忘记调用此自定义initialize函数,那么在其他实例方法中使用的变量仍然可能未定义的问题.但这种方法有什么好处?

met*_*ter 4

一些野外的 API(例如 inside setuptools)也有类似的东西,并且他们利用它来发挥自己的优势。该__init__调用可用于低级内部 API,而公共构造函数被定义为类方法,用于构造对象的不同方式。例如,在 中pkg_resources.EntryPoint,创建此类实例的方法是使用类parse方法。如果需要自定义初始化,可以遵循类似的方法

class CustomDatasetDataLoader(object):

    @classmethod 
    def create(cls):
        """standard creation""" 
        return cls() 

    @classmethod
    def create_with_initialization(cls, opt):
        """create with special options."""
        inst = cls()
        # assign things from opt to cls, like
        # inst.some_update_method(opt.something) 
        # inst.attr = opt.some_attr
        return inst 
Run Code Online (Sandbox Code Playgroud)

这样,该类的用户将不需要两行代码来完成一行代码可以完成的工作,他们可以简单地调用(CustomDatasetDataLoader.create_with_initialization(some_obj)如果这是他们想要的),或者调用其他类方法来构造此类的实例。

编辑:我明白了,您有一个链接的示例(希望下划线链接不会过时)-当类方法(或仅依赖于标准__init__)就足够时,我认为这种特定的用法和实现是一种糟糕的方法。

然而,如果该初始化函数是与某些其他系统的接口,该系统接收特定类型的对象以调用它的某些方法(例如类似于访问者模式的东西),那么它可能是有意义的,但事实上它确实没有意义't。