2013-05-08 64 views
1

我只是在研究一个大类的层次结构,并认为可能默认情况下,类中的所有方法都应该是classmethods。默认情况下,类中的方法应该是classmethod吗?

我的意思是,很少有人需要更改对象的实际方法,并且可以明确传递任何需要的变量。而且,这种方式会有更少的方法让人们可以改变对象本身(更多的打字方式是以其他方式进行),人们更倾向于默认情况下是“功能性”的。

但是,我是一个newb并希望找出我的想法(如果有任何:)的缺陷。

+0

你的前提是错误的。什么让你有那个想法?如果它不是实例方法,只需将其设置为模块级功能即可。 – delnan 2013-05-08 11:48:36

+0

对不起,我很难跟随你想说的话。你的问题到底是什么? – 2013-05-08 11:48:41

+0

@MartijnPieters:我只是想知道为什么它是python中的方法,默认情况下将对象本身作为输入而不是类。因为大多数时候你并不需要在对象本身上设置一个状态,例如我正在处理一个数据库类,并且我定义了一个方法,该方法给了我关于数据的一些统计信息,它只需要一些数据而不需要真的是初始化可能会很昂贵的完整对象,那么为什么不把classmethod作为默认值呢?但我想这可能只是在我目前的用例中发生。 – Pushpendre 2013-05-08 17:48:31

回答

1

如果该方法不访问任何对象的状态,但是特定于该对象的类,那么它是一个适合作为类方法的好候选者。

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

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

+1

+1它完全掌握在开发者手中,没有一般的答案。但通常不需要类方法。 – apparat 2013-05-08 11:56:16

+0

将例程作为'classmethod'放入类中通常会声明此例程与此类的逻辑连接。如果它正在访问任何类变量,这将是对这种连接的强烈暗示。但是,如果它不访问这个类的任何东西,但是在逻辑上是连接的,它应该放在类中,然后可能是一个'staticmethod'。 – Alfe 2013-05-08 12:14:34

3

将classmethods作为默认类是一个众所周知但过时的范例。这就是所谓的模块化编程。您的课程通过这种方式成为模块。

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

事实证明,这在实践中更加有用。结合继承等其他OOP体系结构思想,可以提供直接的方式在开发人员头部表示模型。

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

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

,而只有有classmethods你就必须把它写成

type(a).__gt__(a, b) 

这是可读的要少得多。

+1

感谢您的回答,我会查阅一些关于模块化编程的文章,并了解为什么它变得过时。当我获得足够的业力时,我会给你投票:) – Pushpendre 2013-05-08 12:14:54

相关问题