Python 风格问题:支持类作为内部类吗?

3 投票
4 回答
1503 浏览
提问于 2025-04-16 10:14

我喜欢用语言自带的结构来整理我的代码。不过,有一种情况让我很困惑,因为我找不到一个明确的最佳做法。那就是关于支持类,也就是那些只在另一个类内部使用的类:我应该把它们做成内部类,还是单独的类。

内部类:

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的规定:

内部使用的类前面也要加个下划线。

撰写回答