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函数,那么在其他实例方法中使用的变量仍然可能未定义的问题.但这种方法有什么好处?
一些野外的 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。