当前位置: 首页 > 面试题库 >

嵌套的Python类需要访问封闭类中的变量

麻学博
2023-03-14
问题内容

我已经看到了一些“解决方案”,但是每次的解决方案似乎都是“不要使用嵌套类,在外部定义类,然后再正常使用它们”。我不喜欢这个答案,因为它忽略了我选择嵌套类的主要原因,即拥有一个常量池(与基类相关联),该常量池可用于所有创建的子类实例。

这是示例代码:

class ParentClass:

    constant_pool = []
    children = []

    def __init__(self, stream):
        self.constant_pool = ConstantPool(stream)
        child_count = stream.read_ui16()
        for i in range(0, child_count):
            children.append(ChildClass(stream))

    class ChildClass:

        name = None

        def __init__(self, stream):
            idx = stream.read_ui16()
            self.name = constant_pool[idx]

所有类都传递一个参数,这是一个自定义的位流类。我的目的是要提供一种解决方案,该解决方案不需要我仍在ParentClass中时读取ChildClass的idx值。所有子类流读取都应在子类中进行。

此示例过于简化。常量池不是我需要用于所有子类的唯一变量。idx变量不是从流读取器读取的唯一内容。

在python中甚至可能吗?没有办法访问父母的信息吗?


问题答案:

尽管我发表了“有点光顾”的评论(公平地称呼它!),实际上还是有一些方法可以实现您想要的:继承的另一种途径。一对夫妇:

  1. 编写一个装饰器,该装饰器在声明一个类后立即对其进行内省,找到内部类,并将属性从外部类复制到它们中。

  2. 用元类做同样的事情。

这是装饰器方法,因为它是最简单的方法:

def matryoshka(cls):

    # get types of classes
    class classtypes:
        pass
    classtypes = (type, type(classtypes))

    # get names of all public names in outer class
    directory = [n for n in dir(cls) if not n.startswith("_")]

    # get names of all non-callable attributes of outer class
    attributes = [n for n in directory if not callable(getattr(cls, n))]

    # get names of all inner classes
    innerclasses = [n for n in directory if isinstance(getattr(cls, n), classtypes)]

    # copy attributes from outer to inner classes (don't overwrite)
    for c in innerclasses:
        c = getattr(cls, c)
        for a in attributes:
            if not hasattr(c, a):
                setattr(c, a, getattr(cls, a))

    return cls

这是其用法的一个简单示例:

@matryoshka
class outer(object):

    answer = 42

    class inner(object):

        def __call__(self):
            print self.answer

outer.inner()()   # 42

但是,我不禁认为其他答案中提出的一些想法会更好地为您服务。



 类似资料:
  • 问题内容: 在Java中,内部类可以访问封闭类的私有成员。但是外层可以访问内层的私有成员吗?这与内部类是否静态无关。我认为这是不正确的,但是以下代码似乎可以编译并正常工作。 问题答案: 是的,没关系。从JLS,第6.6.1节中: 否则,如果声明了成员或构造函数,则仅当访问发生在封装成员或构造函数的声明的顶级类(第7.6节)的主体内时,才允许访问。 您甚至可以在另一个嵌套类型Y中引用嵌套类型X的私有

  • 问题内容: 谁能告诉我私人会员的访问级别?我一直对这段代码感到困惑:为什么可以在外部类的“打印”方法中访问Line类的私有成员k? 问题答案: 规则在有关可访问性的JLS章中 否则,如果声明了成员或构造函数,则仅当访问发生 在封装成员或构造函数的声明的顶级类(第7.6节)的主体内 时,才允许访问 。 在这里,成员字段在类中声明。当您在方法中访问它时,您正在 包含该 成员 的声明的顶级类的主体中对其

  • 本文向大家介绍Java中如何使用lambda访问封闭类中的变量,包括了Java中如何使用lambda访问封闭类中的变量的使用技巧和注意事项,需要的朋友参考一下 Lambda 表达式的封闭范围定义的变量可以在 lambda 表达式中访问。Lambda 表达式可以访问实例、静态变量和由封闭类定义的方法。它还可以访问“ this”变量(隐式和显式) ,该变量可以是封闭类的实例。Lambda 表达式还设置

  • 问题内容: 我正在阅读Java中的匿名类,它说您可以访问封闭类的方法,但不能访问局部变量。为什么会这样呢?我在说这个: 编辑:较旧的示例是不正确的,不能反映我的意思。根据在“访问封闭类的成员”一节中所写的内容,这应该是一个更好的示例,网址为http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html。 那么这个限制解决了什

  • 问题内容: 这个错误是什么意思? 嵌套类型HelloWorld无法隐藏封闭类型 其中HelloWorld是Java文件名。这是您需要的代码: 问题答案: 您已经两次定义了HelloWorld类。删除一个级别,就可以了。

  • 问题内容: 得知子类的类变量无法访问父类的类变量而没有特别指出父类的名称,我感到很惊讶: 为什么在定义By时我必须引用Ax,而不仅仅是x?这与我对实例变量的直觉是相反的,并且因为在定义B之后我可以引用Bx。 问题答案: 在Python中,在创建类之前,将在其自己的名称空间中执行类的主体(此后,该名称空间的成员将成为该类的成员)。因此,当解释器达到y = x + 1时,此时B类尚不存在,因此没有父类