为什么我在Python中使用classmethod构造函数?

时间:2016-05-25 01:09:23

标签: python constructor polymorphism class-method

我正在阅读Slatkin的Effective Python。在第24项中,他谈到了通过使用扮演构造函数的classmethod函数来实现python中的多态性。

但是,我不清楚为什么这是必要的。为什么我们不能通过简单地使用__init__并在每个派生类中重写它来实现相同的目标,就像我们覆盖classmethod一样?

在他的情况下,他每个类只有一个构造函数,那么为什么不使用常规init来达到这个目的而不是classmethod?

你可以看到这里的第24项,遗憾的是细节缺失: http://ptgmedia.pearsoncmg.com/images/9780134034287/samplepages/9780134034287.pdf

此处有更多详情: http://qiita.com/giwa/items/fd563a93825714cffd70

1 个答案:

答案 0 :(得分:3)

在本书给出的示例中,classmethod不会生成单个元素。所有不同的类都支持相同的类方法(相同的签名),但是它们用于生成实例或生成的数量,被委托给类。

例如,PathInputData类基于config['data_dir']配置生成输入,使用os.listdir()读取所有输入文件。您可以想象一个DatabaseInputData类提供相同的generate_inputs()类方法,而是连接到数据库并运行SQL查询。它会寻找不同的配置。等

您不能使用__init__方法执行此操作;这是用于初始化单个实例。如果要生成该类的0个实例,则甚至不会调用__init__,但是委派责任以确定必须为该类生成的实例数仍然是个好主意< / em>的