在Python的另一个类中定义一个类是否有好处?
我在这里谈论的是嵌套类。本质上,我有两个正在建模的类。一个DownloadManager类和一个DownloadThread类。这里显而易见的OOP概念是组合。但是,组合不一定意味着嵌套,对吗?
我有看起来像这样的代码:
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 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'''
我觉得当我们需要此功能时,我们会很清楚。如果我们不需要做类似的事情,那可能不是一个好用例。
回答
这样做确实没有任何好处,除非我们要处理元类。
上课:套房真的不是我们想的那样。这是一个奇怪的范围,它做奇怪的事情。它甚至根本没有上课!这只是一种收集一些变量的方法,这些变量包括类的名称,基类,一些属性的字典以及一个元类。
名称,字典和基数都传递给元类的函数,然后在class:suite所在的作用域中将其分配给变量" name"。
通过弄乱元类,甚至通过在股票标准类中嵌套类而获得的东西,更难于阅读代码,更难于理解代码,而如果不熟悉"类"的原因则很难理解的奇数错误。作用域与任何其他python作用域完全不同。