我只是在研究一个大型的类层次结构,并认为一个类中的所有方法可能都应该是默认的类方法。
我的意思是很少需要更改对象的实际方法,并且可以显式传入任何需要的变量。此外,通过这种方式,人们可以更改对象本身的方法数量会更少(以另一种方式进行更多的输入),并且默认情况下人们会更倾向于“功能性”。
但是,我是一个新手,想找出我的想法中的缺陷(如果有的话:)。
将类方法作为默认值是一种众所周知但已过时的范例。它被称为模块化编程。通过这种方式,您的类成为有效的模块。
面向对象范式(OOP)通常被认为优于模块化范式(而且它更年轻)。主要区别在于,部分代码默认与一组数据(称为对象)相关联,因此与类方法无关。
事实证明,这更有用。结合其他 OOP 架构思想(如继承),这提供了更直接的方式来表示开发人员头脑中的模型。
使用对象方法,我可以编写可用于各种类型对象的抽象代码;在编写例程时,我不必知道对象的类型。例如。我可以编写一个max()
例程,将列表的元素相互比较以找到最大的。然后使用>
操作符进行比较,该操作符实际上是元素的对象方法(在 Python 中 this 是__gt__()
,在 C++ 中它将是operator>()
等等)。现在对象本身(可能是一个数字,可能是一个日期等)可以处理它自己与另一个类型的比较。在代码中,这可以写成
a > b # in Python this calls a.__gt__(b)
而只有 classmethods 你必须把它写成
type(a).__gt__(a, b)
这可读性要差得多。
如果该方法不访问任何对象的状态,但特定于该对象的类,那么它是一个很好的类方法候选者。
否则,如果它更通用,则只需使用在模块级别定义的函数,无需使其属于特定类。
我发现 classmethods 实际上在实践中非常罕见,当然也不是默认的。那里应该有很多好的代码(例如在 github 上)可以从中获取示例。