【问题标题】:How to change an instance attribute of an object by calling a statically called method in nested classes如何通过调用嵌套类中的静态调用方法来更改对象的实例属性
【发布时间】:2019-06-29 03:06:14
【问题描述】:

我希望 Inner 类更改实例化对象 (o) 的属性,在本例中为“some_var”; o.some_var.

我已经尝试在 Google 和 stackoverflow 上搜索有关嵌套类以及内部类如何访问外部类属性的信息。我更改了内部类所采用的参数,例如实例化对象(self),没有效果。

class Outer:
    def __init__(self):
        self.some_var = 1
        self.Inner = Inner()

    class Inner:
        def print_some_var(self):
            print("I'm Inner's method, printing:", self.some_var)

        def change_some_var(self, n):
            self.some_var = n

o = Outer()

print("Printing directly.", o.some_var)
o.Inner.print_some_var()
o.Inner.change_some_var(5)
o.Inner.print_some_var()

我需要这段代码中的两件事,既基于可以访问外部类的内部类,也基于通过静态调用它(内部类)和更改外部类对象属性(some_var )。喜欢:

  1. 通过调用 Inner 类来更改 Outer 类对象的 some_var,例如“o.Inner.change_some_var(5)”。
  2. 通过在实例化对象内部静态调用 Inner 类来打印/读取 Outer 类对象的 some_var,例如“o.Inner.print_some_var()”。

相反,python 解释器向我抛出了一个异常:

Traceback (most recent call last):
  File "nestedclasses.py", line 16, in <module>
    o.Inner.print_some_var()
  File "nestedclasses.py", line 8, in print_some_var
    print("I'm Inner's method, printing:", self.some_var)
AttributeError: 'Inner' object has no attribute 'some_var'

【问题讨论】:

    标签: python class nested


    【解决方案1】:
    class Outer:
        def __init__(self):
            self.some_var = 1
            self.inner = Inner(self)
    
    class Inner:
        def __init__(self, parent):
            self.parent = parent
    
        def print_some_var(self):
            print("I'm Inner's method, printing:", self.parent.some_var)
    
        def change_some_var(self, n):
            self.parent.some_var = n
    
    o = Outer()
    
    print("Printing directly.", o.some_var)
    o.inner.print_some_var()
    o.inner.change_some_var(5)
    o.inner.print_some_var()
    

    【讨论】:

    • 太棒了!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多