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

时间:2020-03-05 18:57:36  来源:igfitidea点击:

我在这里谈论的是嵌套类。本质上,我有两个正在建模的类。一个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作用域完全不同。