Python 风格问题:支持类作为内部类吗?
我喜欢用语言自带的结构来整理我的代码。不过,有一种情况让我很困惑,因为我找不到一个明确的最佳做法。那就是关于支持类,也就是那些只在另一个类内部使用的类:我应该把它们做成内部类,还是单独的类。
内部类:
class Complicated:
class Utility1:
pass
class Utility2:
pass
pass
单独的类:
class Complicated:
pass
class Utility1:
pass
class Utility2:
pass
内部类的好处是它们只在使用它们的那个类里面可见,这样可以避免其他地方的干扰。但是问题是,由于缩进的原因,我写代码的空间变得更小了。
外部类则没有这种优缺点。我每次写支持类的时候,都要花费一些脑力去思考这个小问题,真让人疲惫。
我的问题是,有没有经验丰富的Python高手能给我一些建议,关于这方面有没有什么最佳实践?即使答案是“这要看情况”,如果能听到比我更有经验的人说说,那我也会很感激。
4 个回答
0
我选择用内部类还是外部类,主要看我是否希望能在子类中或者每个实例中重写这个类型:
class Foo(object):
normalize = str
def process(self, input):
# Do some stuff in here...
return self.normalize(output)
class UniFoo(Foo):
normalize = unicode
class TotallyMungedFoo(Foo):
class normalize(object): ...
如果我不觉得需要(或者明确不想要)这样的行为,我就会在同一个模块里使用类,但只在我的 __all__
声明中包含“重要”的那个类。
1
我在Python包里面的类名前面加一个下划线,表示这些类是内部使用的。我觉得这是一个常见的Python写法:
class Complicated:
pass
class _Utility1:
pass
class _Utility2:
pass
6
我建议你这样做:
class Complicated:
pass
class _Utility1:
pass
class _Utility2:
pass
把这些内容放到一个单独的模块里。前面加个_
的意思是这些工具类只供内部使用(而且它们不会被from module import *
这种方式导入;不过我其实也不喜欢这样做)。
补充一下:根据PEP 8的规定:
内部使用的类前面也要加个下划线。