我正在阅读Slatkin的Effective Python。在第24项中,他谈到了通过使用扮演构造函数的classmethod
函数来实现python中的多态性。
但是,我不清楚为什么这是必要的。为什么我们不能通过简单地使用__init__
并在每个派生类中重写它来实现相同的目标,就像我们覆盖classmethod
一样?
在他的情况下,他每个类只有一个构造函数,那么为什么不使用常规init来达到这个目的而不是classmethod?
你可以看到这里的第24项,遗憾的是细节缺失: http://ptgmedia.pearsoncmg.com/images/9780134034287/samplepages/9780134034287.pdf
答案 0 :(得分:3)
在本书给出的示例中,classmethod不会生成单个元素。所有不同的类都支持相同的类方法(相同的签名),但是它们用于生成实例或生成的数量,被委托给类。
例如,PathInputData
类基于config['data_dir']
配置生成输入,使用os.listdir()
读取所有输入文件。您可以想象一个DatabaseInputData
类提供相同的generate_inputs()
类方法,而是连接到数据库并运行SQL查询。它会寻找不同的配置。等
您不能使用__init__
方法执行此操作;这是用于初始化单个实例。如果要生成该类的0个实例,则甚至不会调用__init__
,但是委派责任以确定必须为该类生成的实例数仍然是个好主意< / em>的