在Python的另一个类中定义一个类是否有好处?

我在这里讨论的是嵌套类。 基本上,我有两个我正在build模的类。 DownloadManager类和DownloadThread类。 这里明显的面向对象的概念是组合。 但是,构图并不一定意味着嵌套,对吧?

我有这样的代码:

class DownloadThread: def foo(self): pass class DownloadManager(): def __init__(self): dwld_threads = [] def create_new_thread(): dwld_threads.append(DownloadThread()) 

但是现在我想知道是否有一个嵌套会更好的情况。 就像是:

 class DownloadManager(): class DownloadThread: def foo(self): pass def __init__(self): dwld_threads = [] def create_new_thread(): dwld_threads.append(DownloadManager.DownloadThread()) 

当“内部”类是一次性的时候,你可能会想这样做,这是永远不会在外部类的定义之外使用的。 例如,要使用元类,有时候很方便

 class Foo(object): class __metaclass__(type): .... 

而不是单独定义一个元类,如果你只使用它一次。

我唯一一次使用嵌套类的时候,我只用外部类作为命名空间来把一堆紧密相关的类组合在一起:

 class Group(object): class cls1(object): ... class cls2(object): ... 

然后从另外一个模块中,你可以导入Group,并将它们引用为Group.cls1,Group.cls2等。但是有人可能会争辩说,通过使用模块,你可以完全相同(也许以一种不那么令人困惑的方式)。

我不知道Python,但你的问题似乎很普遍。 忽略我,如果它是特定于Python。

类嵌套是关于范围的。 如果你认为一个阶级只有在另一个阶级的情况下才有意义,那么前者可能是成为一个嵌套阶级的好人选。

这是一个常见的模式,使辅助类作为私人的嵌套类。

这样做真的没有好处,除非你正在处理元类。

class级:套房真的不是你想象的那样。 这是一个奇怪的范围,它做了奇怪的事情。 它甚至没有上课! 这只是收集一些variables的一种方式 – 类的名称,基础,属性的小字典和元类。

名称,字典和基地都被传递给作为元类的函数,然后将其分配给类:套件所在作用域中的variables“名称”。

你可以通过混淆metaclasses,甚至通过在你的stock标准类中嵌套类来获得什么,如果不熟悉为什么“class”会被理解,那么很难阅读代码,难以理解代码和难以理解的奇怪错误,范围是完全不同的任何其他python作用域。

你可以使用一个类作为类生成器。 喜欢(在一些closures袖口:)

 class gen(object): class base_1(object): pass ... class base_n(object): pass def __init__(self, ...): ... def mk_cls(self, ..., type): '''makes a class based on the type passed in, the current state of the class, and the other inputs to the method''' 

我觉得当你需要这个function的时候,你会很清楚。 如果你不需要做类似的事情,那么可能不是一个好的用例。

不,构图并不意味着嵌套。 如果要将其隐藏在外部类的名称空间中,则有一个嵌套类是有意义的。

无论如何,我没有看到你的情况下嵌套的实际用途。 这将使代码更难阅读(理解),这也会增加缩进,使线条更短,更容易分裂。