一个类中的方法默认是classmethod吗?

时间:2013-05-08 11:46:38

标签: python oop

我只是在处理一个大型的层次结构,并认为类中的所有方法都可能是默认的classmethods。

我的意思是,很少需要更改对象的实际方法,并且可以显式传递所需的任何变量。此外,通过这种方式,人们可以改变对象本身的方法数量较少(更多的打字方式可以用另一种方式进行),而人们更倾向于使用"功能性"默认情况下。

但是,我是 newb ,并希望找出我的想法中的缺陷(如果有的话)。

2 个答案:

答案 0 :(得分:3)

将类方法作为默认值是一个众所周知但过时的范例。它被称为模块化编程。你的课程以这种方式成为有效的模块。

面向对象范式(OOP)主要被认为优于模块化范式(并且它更年轻)。主要区别在于,默认情况下,部分代码与一组数据(称为对象)相关联 - 因此不是类方法。

事实证明,这更有用。结合其他OOP架构思想,如继承,这提供了在开发人员头脑中表示模型的直接方法。

使用对象方法我可以编写可用于各种类型对象的抽象代码;在编写例行程序时,我不必知道对象的类型。 E. g。我可以编写一个max()例程,将列表中的元素相互比较以找到最大的元素。然后使用>运算符进行比较,该运算符实际上是元素的对象方法(在Python中,这是__gt__(),在C ++中它将是operator>()等。现在,对象本身(可能是一个数字,可能是一个日期等)可以处理自身与另一个类型的比较。在代码中,这可以写为

a > b   # in Python this calls a.__gt__(b)

虽然只有classmethods,你必须把它写成

type(a).__gt__(a, b)

更不易读。

答案 1 :(得分:1)

如果方法不访问任何对象的状态,但是特定于该对象的类,则它是一个很好的候选者,可以成为一个类方法。

否则,如果它更通用,那么只需使用在模块级别定义的函数,不需要使其属于特定类。

我发现在实践中,类方法实际上非常罕见,当然不是默认方法。应该有很多好的代码(例如github)来获取示例。