用Python在另一个类中定义一个类有什么好处吗?

2024-04-20 08:40:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我说的是嵌套类。基本上,我有两个我正在建模的类。下载管理器类和下载线程类。这里明显的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())

Tags: selfnewfooinitdefcreatepass建模
3条回答

我不认识Python,但你的问题似乎很笼统。如果是特定于Python的,请忽略我。

类嵌套与作用域有关。如果您认为一个类只在另一个类的上下文中才有意义,那么前者可能是成为嵌套类的一个很好的候选者。

它是一种常见的模式,将助手类作为私有的嵌套类。

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

学生:套房真的不是你想象的那样。这是一个奇怪的范围,它做奇怪的事情。它真的连课都上不了!它只是收集一些变量的一种方式——类的名称、基、一些属性字典和一个元类。

名称、字典和基都被传递给作为元类的函数,然后它被分配给class:suite所在的作用域中的变量“name”。

如果不熟悉“类”作用域与任何其他python作用域完全不同的原因,那么通过混淆元类,甚至通过将类嵌套在您的标准类中,您将获得更难阅读的代码、更难理解的代码和非常难以理解的奇怪错误。

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

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

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

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

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

    class cls2(object):
       ...

然后,从另一个模块中,您可以导入Group并将其称为Group.cls1、Group.cls2等。但是,有人可能会说,通过使用一个模块,您可以完成完全相同的任务(也许是以一种不那么混乱的方式)。

相关问题 更多 >