在课堂上放置支持功能的最佳位置在哪里?

时间:2015-06-02 15:35:47

标签: python class

在Python中,我有一个我已经建立的课程。

但是,有一种方法可以应用相当特定类型的子字符串搜索过程。这个程序本身可以是一个独立的函数(它只需要一个针头一个大海捞针的字符串),但是让这个函数在类外面感觉很奇怪,因为我的类依赖于它。

典型的设计范例是什么?在同一个文件中,将myClassName.py与主类以及类本身之外的所有支持函数一起使用是典型的吗?或者以模块化为代价将支持函数嵌入到类中是否更好?

3 个答案:

答案 0 :(得分:0)

如果有一天你能想到或有任何理由重写这个函数,那就把它变成staticmethod,否则普通函数就可以了 - FWIW,你的类可能比这个简单的函数要多得多。如果您无法想到其他人使用此功能的任何理由,请将其保存在与您班级相同的模块中。

作为旁注:“myClassName.py”绝对是unpythonic。首先因为模块名称应该是all_lower,然后因为每个类的一个模块的东西在Python中是无意义的 - 我们将相关的类和函数(以及异常和诸如此类的东西)组合在一起。

答案 1 :(得分:0)

您可以创建staticmethod,如下所示:

class yo:
    @staticmethod
    def say_hi():
        print "Hi there!"

然后,你可以这样做:

>>> yo.say_hi()
Hi there!
>>> a = yo()
>>> a.say_hi()
Hi there!

它们可以非静态地使用,也可以静态使用(如果有意义的话)。

关于将功能放在哪里......

如果类需要某个方法,并且该方法适合执行特定于该类的数据,则将其设为方法。这就是你想要的:

class yo:
    self.message = "Hello there!"
    def say_message(self):
        print self.message

我的say_message依赖于特定于类实例的数据。

如果你觉得需要一个函数,除了类方法之外,一定要继续。使用脚本中更合适的一个。有很多这方面的例子,包括在python内置插件中。以生成器对象为例:

a = my_new_generator()
a.next()

也可以这样做:

a = my_new_generator()
next(a)

使用哪个更合适,显然哪个更具可读性。 :)

答案 2 :(得分:0)

如果您正在谈论的搜索方法非常具体,并且您永远不需要在其他地方重复使用它,我认为没有任何理由将其设置为静态。根据定义,它不需要访问实例变量这一事实并不会使其成为静态。

如果有可能,该方法将被重用,请将其重构为辅助/实用程序类(不再是静态)。

<强>增加: 只是想补充一点,当你认为某些东西是静态的时,请考虑方法名称与类名的关系。在类上下文或对象上下文中使用时,此方法名称是否更有意义?