多年来,我一直将 python 用于科学目的。我最近对类编写更加熟悉,但我觉得我缺少一些关于实例化类的标准方法的东西。
假设我定义了一个类MyClass。
class MyClass:
def __init__(self):
pass
Run Code Online (Sandbox Code Playgroud)
然后我知道我可以简单地映射x到一个实例MyClass
x = MyClass()
Run Code Online (Sandbox Code Playgroud)
这工作得很好,完全符合我的预期。
然而,在我看来,当我使用代码从标准库或numpy或者scipy,我不创建以同样的方式对象:据我所知,我一般不使用类的名称来实例化。根据我的理解,我会说这意味着我既不使用类方法也不使用类的默认构造函数,而是使用在类之外定义的其他函数。
例如,numpy的random模块使用一个类Generator来生成随机数。但是,numpy明确建议不要使用类构造函数来获取Generator实例,而是使用模块中的default_rng函数random。所以如果我想生成随机数,我使用
rng = numpy.random.default_rng()
Run Code Online (Sandbox Code Playgroud)
创建一个Generator实例。这是在不明确使用类名的情况下完成的。
在我看来,我使用的大部分代码都是用后一种方式编写的。为什么呢?直接调用默认类构造函数在某种程度上被认为是不好的做法吗?在模块中使用单独的函数来创建类实例是否被认为是更好的做法?仅仅是因为在创建类的实例之前通常必须进行一些预处理吗?(我想不是,因为那样的话,为什么不在类的初始化中这样做呢?)