在Python中,我有一个我已经建立的课程。
但是,有一种方法可以应用相当特定类型的子字符串搜索过程。这个程序本身可以是一个独立的函数(它只需要一个针头一个大海捞针的字符串),但是让这个函数在类外面感觉很奇怪,因为我的类依赖于它。
典型的设计范例是什么?在同一个文件中,将myClassName.py与主类以及类本身之外的所有支持函数一起使用是典型的吗?或者以模块化为代价将支持函数嵌入到类中是否更好?
答案 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)
如果您正在谈论的搜索方法非常具体,并且您永远不需要在其他地方重复使用它,我认为没有任何理由将其设置为静态。根据定义,它不需要访问实例变量这一事实并不会使其成为静态。
如果有可能,该方法将被重用,请将其重构为辅助/实用程序类(不再是静态)。
<强>增加:强> 只是想补充一点,当你认为某些东西是静态的时,请考虑方法名称与类名的关系。在类上下文或对象上下文中使用时,此方法名称是否更有意义?