2010-08-26 27 views
18

我正在将一堆相关的东西放到一个类中。主要目的是将它们组织到一个名称空间中。在Python中使用类作为命名空间是一个好主意

class Direction: 

    north = 0 
    east = 1 
    south = 2 
    west = 3 

    @staticmethod 
    def turn_right(d): 
    return turn_to_the_right 

    @staticmethod 
    def turn_left(d): 
    return turn_to_the_left 



# defined a short alias because direction will be used a lot 
D = Direction 

d0 = D.north 
d1 = D.turn_right(d) 

涉及的对象概念并不多。在C++中,我将使用实际的语言关键字namespace。 Python中没有这样的东西。所以我试图用class来达到这个目的。

这是个好主意吗?这种方法有什么陷阱?

我刚才回答了一个相关的问题。这个问题以不同的方式提出。这是我需要为自己做出的实际决定。

静态方法VS在Python模块功能 - 堆栈溢出

Static method vs module function in python

+0

谢谢。到目前为止,我得到的评论是 1.使用模块 2.做什么是有道理的。 我还想弄清楚的是,如果仅仅将类用作命名空间或者有一些不合理的理由,就认为类是合法的选项。 – 2010-08-26 18:14:01

回答

14

号棒它的模块代替英寸Python不具有与C++相同的名称空间,但模块提供了类似的用途(即将“类”类和函数组合在一起,并为它们提供唯一名称以避免冲突)。

编辑
我看到您发布到您的问题的评论。为了更明确地回答,不,在Pythonic代码中,使用类来模拟命名空间是不正确的。模块可以将相关的类,函数和变量分组 - 使用模块来代替。一个类表示一个具有行为(方法)和数据(实例变量)的“事物” - 它不仅仅是一个独立函数和变量的集合。

+2

模块有更强的理由吗?我可以考虑一个选择'从方向导入*'。另一方面,如果“北,东,南,西”只有4个常量,将它们放入它们自己的模块似乎是一种矫枉过正。 – 2010-08-26 15:54:37

+1

从组织的角度来看,你应该把它们放在有意义的地方。如果他们与现有的模块“一起”,把它们放在那里(你可以将它们重命名为“DIRECTION_NORTH”或其他)。如果没有的话,把它们放在一个单独的模块中,如果有意义的话。 – mipadi 2010-08-26 15:59:09

+0

您使用类而不是名称空间模块的基本原理否定了这两种东西在Python中共享的真实品质。比不同的更多。 – uchuugaka 2017-10-14 13:46:14

2

是的,没关系。您甚至可以使用property使方法看起来像属性。

如果你有一个大的类,它可能是整洁使用模块

2

这要看情况;如果你可以在模块中保留一个常量并且有意义,那么通过一定的方式这样做,但是将它们放在类中可以使它们的含义更加明显,并且允许类似的常量具有更多的“抽象”:将它们放置在ServerError上课比在模块中自由居住的前SERVER_ERROR更有意义。

做什么最直观,但尽量避免命名空间污染。

4

是的的确的。您可以严格地将Python类用于名称空间,因为这是他们可以做的特殊事情之一,并且与模块不同。将一个类定义为文件内联的命名空间比生成更多文件要容易得多。 你不应该没有评论你的代码说明它的用途。 Python类有很多不同的形式和目的,这使得难以理解以前没见过的代码。

用作命名空间的Python类不仅仅是一个Python类,而是一种满足对其他语言中类的感知的Python类。 Python不需要将一个类实例化为有用的。它不需要ivars,也不需要方法。它非常灵活。

Clases也可以包含其他类。

很多人对什么是或不是Pythonic有他们的想法。 但是,如果他们都担心像一致性,他们会推动像len()dir()help()是一种对象的方法而不是全局函数。

如果不常见或明显的用法,做一些有用的工作,评论/记录它。

相关问题