在Python中将类作为命名空间是个好主意吗

47 投票
5 回答
14064 浏览
提问于 2025-04-16 03:20

我把一堆相关的东西放进一个类里,主要目的是为了把它们整理成一个命名空间。

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来达到这个目的。

这样做好吗?会有什么问题吗?

我昨天刚回答了一个相关的问题,这个问题问得有点不同。其实这是我自己需要做的一个决定。

Python中的静态方法与模块函数 - Stack Overflow

Python中的静态方法与模块函数

5 个回答

5

没问题,你可以使用 property 让方法看起来像属性一样。

如果你的类很大,使用模块可能会让代码看起来更整洁。

18

不,还是把它放在一个模块里吧。

Python的命名空间和C++的方式不太一样,但模块的作用有点类似(就是把“相似”的类和函数放在一起,并给它们独特的名字,以避免名字冲突)。

编辑
我看到你在问题下的评论了。更明确地说,在Python的代码中,用类来模拟命名空间并不太正确。模块是用来把相关的类、函数和变量放在一起的——所以应该使用模块。类代表的是一个“东西”,它有行为(方法)和数据(实例变量)——而不仅仅是一些独立的函数和变量的集合。

32

没错,你可以把Python类用来做命名空间,这也是它们的一个特别之处,和模块的用法有所不同。在文件中直接定义一个类作为命名空间,比起生成更多的文件要简单得多。

不过,使用这种方式时,记得在代码里加上注释,说明这样做的目的是什么。

Python的类有很多不同的形式和用途,这让你在看到不熟悉的代码时可能会感到困惑。

把Python类当作命名空间使用,和其他语言中对类的理解没有本质上的区别。Python不需要你实例化一个类才能使用它,也不要求有实例变量(ivars)和方法。它的灵活性很高。

类里面也可以包含其他类。

很多人对什么是“Pythonic”(符合Python风格)有自己的看法。但如果大家都在意一致性的话,他们应该会希望像len()dir()help()这些函数成为对象的方法,而不是全局函数。

总之,做对你有用的事情,如果用法不常见或不明显,记得加上注释或文档说明。

撰写回答