我正在调查以下code。
在很多情况下,__init__
方法并未真正使用,但有一个自定义initialize
函数,如下例所示:
def __init__(self):
pass
def initialize(self, opt):
# ...
然后将其称为:
data_loader = CustomDatasetDataLoader()
# other instance method is called
data_loader.initialize(opt)
我发现如果忘记调用此自定义initialize
函数,那么在其他实例方法中使用的变量仍可能未定义的问题。但这种方法有什么好处呢?
答案 0 :(得分:2)
一些野外的API(例如内部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
这样,类的用户不需要两行代码来完成单行可以做的事情,如果这是他们想要的,他们可以简单地调用CustomDatasetDataLoader.create_with_initialization(some_obj)
,或者调用另一个类方法来构造一个这个类的实例。
编辑:我明白了,你有一个链接的例子(希望强调链接不会过时) - 我觉得这种特殊的用法和实现方式很糟糕,当一种类方法(或仅仅依赖于标准) __init__
)就足够了。
但是,如果初始化函数是与某个其他系统的接口,该系统接收特定类型的对象以调用某些方法(例如类似于访问者模式的东西),那么它可能是有意义的,但是因为它是它确实没有。