在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
来达到这个目的。
这样做好吗?会有什么问题吗?
我昨天刚回答了一个相关的问题,这个问题问得有点不同。其实这是我自己需要做的一个决定。
Python中的静态方法与模块函数 - Stack Overflow
5 个回答
没问题,你可以使用 property
让方法看起来像属性一样。
如果你的类很大,使用模块可能会让代码看起来更整洁。
不,还是把它放在一个模块里吧。
Python的命名空间和C++的方式不太一样,但模块的作用有点类似(就是把“相似”的类和函数放在一起,并给它们独特的名字,以避免名字冲突)。
编辑
我看到你在问题下的评论了。更明确地说,在Python的代码中,用类来模拟命名空间并不太正确。模块是用来把相关的类、函数和变量放在一起的——所以应该使用模块。类代表的是一个“东西”,它有行为(方法)和数据(实例变量)——而不仅仅是一些独立的函数和变量的集合。
没错,你可以把Python类用来做命名空间,这也是它们的一个特别之处,和模块的用法有所不同。在文件中直接定义一个类作为命名空间,比起生成更多的文件要简单得多。
不过,使用这种方式时,记得在代码里加上注释,说明这样做的目的是什么。
Python的类有很多不同的形式和用途,这让你在看到不熟悉的代码时可能会感到困惑。
把Python类当作命名空间使用,和其他语言中对类的理解没有本质上的区别。Python不需要你实例化一个类才能使用它,也不要求有实例变量(ivars)和方法。它的灵活性很高。
类里面也可以包含其他类。
很多人对什么是“Pythonic”(符合Python风格)有自己的看法。但如果大家都在意一致性的话,他们应该会希望像len()
、dir()
和help()
这些函数成为对象的方法,而不是全局函数。
总之,做对你有用的事情,如果用法不常见或不明显,记得加上注释或文档说明。