我在这里谈论的是嵌套类。 基本上,我有两个我正在建模的类。 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())

===============>>#1 票数:109 已采纳

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

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

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

我唯一一次使用这样的嵌套类,我只使用外部类作为命名空间将一堆密切相关的类组合在一起:

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

    class cls2(object):
       ...

然后从另一个模块,你可以导入Group并将它们称为Group.cls1,Group.cls2等。但是有人可能会说你可以通过使用模块完成相同的工作(可能以一种不那么混乱的方式)。

===============>>#2 票数:18

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

类嵌套完全是关于范围的。 如果你认为一个类只在另一个类的上下文中有意义,那么前者可能是成为嵌套类的一个很好的候选者。

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

===============>>#3 票数:6

除非您正在处理元类,否则执行此操作确实没有任何好处。

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

名称,字典和基数都传递给元类的函数,然后将它分配给类:suite所在范围内的变量“name”。

通过弄乱元类,实际上通过在库存标准类中嵌套类,可以获得什么,更难以阅读代码,更难理解代码,以及奇怪的错误,如果不熟悉“类”的原因,这些错误非常难以理解scope与任何其他python范围完全不同。

===============>>#4 票数:5

您可以使用类作为类生成器。 喜欢(在一些袖口代码:)

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'''

我觉得当你需要这个功能时,你会非常清楚。 如果你不需要做类似的事情,它可能不是一个好的用例。

===============>>#5 票数:4

当需要构建其增强功能封装在特定嵌套类中的继承类时,嵌套类还有另一种用法。

看这个例子:

class foo:

  class bar:
    ...  # functionalities of a specific sub-feature of foo

  def __init__(self):
    self.a = self.bar()
    ...

  ...  # other features of foo


class foo2(foo):

  class bar(foo.bar):
    ... # enhanced functionalities for this specific feature

  def __init__(self):
    foo.__init__(self)

请注意,在foo的构造函数中,当构造的对象实际上是foo对象时, self.a = self.bar()行将构造一个foo.bar当构造的对象实际上是一个foo2.bar对象时foo2对象。

如果类别bar是在类foo之外定义的,以及它的继承版本(例如将被称为bar2 ),那么定义新类foo2将会更加痛苦,因为foo2的构造foo2需要拥有它第一行替换为self.a = bar2() ,这意味着重写整个构造函数。

===============>>#6 票数:1

不,构图并不意味着嵌套。 如果要在外部类的命名空间中更多地隐藏它,那么有一个嵌套类是有意义的。

无论如何,我认为在你的情况下没有任何实际的嵌套用法。 这将使代码更难以阅读(理解),并且它还会增加缩进,这会使行更短并且更容易分裂。

  ask by community wiki translate from so

未解决问题?本站智能推荐:

4回复

python中另一个类中的类

我不知道如何获得输出“两个”,请帮忙
1回复

如何访问Python另一个类中定义的对象的属性?

我有这三个班 现在我想创建一个Transaction对象并打印类型 但我收到以下错误 我在这里做错了什么?
1回复

Python:将类对象复制到另一个类中

这个问题已经在这里有了答案: 了解dict.copy()-浅还是深? 7个答案 我有一个定义如下的类: 我有一个字典,其中包含具有键索引的键值对,而值是表对象。 现在,我想获取表对象并将详细信息复制到另一个对象,例如: 如何更改类或将详细信
1回复

Python:将在一个文件中的一个类的方法中定义的变量传递给另一个文件

我使用wxpython创建了一个名为“ WindowClass”的类。 它有几种方法,包括以下三种: 因此,基本上,有两个按钮。 一个标记为“选择输入文件”,另一个标记为“ GO!”。 它们的功能由上述方法定义。 我希望此路径变量在另一个文件中可用,该文件将采用值(文件路径)
2回复

将类的实例(类的对象)传递给python中的另一个类

我不明白的是b = Bar(a) 。 它有什么作用? Bar如何作为一个论点? 不是说Bar继承自? 什么是Bar.Foo1 = Foo? 这是否意味着Foo1是类Foo()的实例? 当它本身是一个对象时,我们如何访问Foo1? b.arg.variable是什么意思? 难道它不
1回复

在python中另一个文件中的另一个类中调用函数

我在2个不同的文件中有2个类: fileA.py fileB.py 对func_A的调用失败。 如何使它正常工作?
4回复

在python中实例化一个类时返回另一个类

我正在尝试使用日志记录的内存处理程序将日志消息缓冲到我的实际日志记录处理程序中。 您可以通过使用一些参数实例化来使用内存处理程序,如下所示: 但是,我不希望我的应用程序必须直接从日志记录中实例化处理程序或传递任何参数。 我希望这段代码看起来像这样: 问题是:我该怎么做? 我
1回复

获取类的名称,另一个类在Python中实例化

是否有可能在第一个类中实例化的另一个类中获取python类的名称。 让我给你举个例子。 class SubClass: top_level_name = None # name class it is instantiated in e.g. TopLevelClass cla
2回复

在另一个文件python中构造类的对象

我正在尝试为应用程序构造Calendar窗口小部件,并且我处于测试编译阶段。 我知道只要所有三个组件都在同一个文件中,程序就可以正确编译,但是我在导入类文件时很费劲。 请原谅这些类的多余代码,只是要注意我的问题是关于如何导入类文件的。 Calendar.py Control.p
1回复

将数据传递给Python中的另一个类

我正在使用Twisted,并且有几个不同类型的回调(因此它们不共享工厂)。 我试图将数据从一个回调对象传递到另一个: 现在,我可以通过在transmit之前使用@staticmethod使其工作。 然后我添加了方法(来自扭曲) self.sendMessage 。 我收到一个错误: