【问题标题】:How can I modify a specific class instance from the method of another class in a different module?如何从不同模块中另一个类的方法修改特定类实例?
【发布时间】:2018-08-05 08:41:36
【问题描述】:

我希望有一个直接作用于另一个类的特定实例的类方法。如果两个类都在同一个模块中定义和实例化,我可以实现这一点,但是当我尝试将这些类导入第二个模块时它就会崩溃。

这是一个显示我的问题的测试代码sn-p:

# Module 1
class Foo:
    def __init__(self):
        self.value = 1

    def get_value(self):
        return self.value

    def increase_value(self):
        self.value += 1


class Bar:
    def read_foo(self):
        foo_value = foo.get_value()
        #Do something with Foo_value
        return foo_value

然后,在另一个模块中,使用与类方法名称匹配的严格名称创建这些类中的每一个的实例。

# Module 2
import test

foo = test.Foo()
bar = test.Bar()
print(bar.read_foo())

现在,当模块 2 运行时,它返回一个“未定义 foo”错误,因为 foo 不是在模块 1 中创建的。我该如何解决这个问题?

编辑:我在第一条评论中提到的解决方案是将 foo 作为参数传递给类方法 read_foo,如下所示:

class Bar:
    def read_foo(self, foo):
        foo_value = foo.get_value()
        #Do something with Foo_value
        return foo_value

【问题讨论】:

  • 这些模块是您自己编写的还是 PyPI 模块?这似乎不起作用,因为 Bar 的 read_foo() 函数正在访问一个不是全局变量或未在函数中定义的变量 (foo)。如果这是您编写的模块,您可以尝试将 Foo 类型的对象传入 Bar 的 read_foo() 函数
  • 我自己编写了这些模块。现在我觉得自己像个白痴,因为你的解决方案太简单了!非常感谢

标签: python python-3.x class import class-method


【解决方案1】:

weakref 模块可能有你要找的东西——它允许你引用一个指向它的对象。如果该库功能不适合您,另一种选择是通过对象的内存位置(由 hex(id(object)) 找到)访问对象。

【讨论】:

  • 对象的id 是它的地址这一事实是实现细节,而不是保证。通过弄乱底层内存来操纵 Python 对象总是是个坏主意,而且问题不需要弱引用,所以你的建议都不是一个好主意。跨度>
  • 很好,感谢您的澄清。看来我需要再给我上学了。有没有像 C 语言那样对对象进行指针式操作的“好”方法,或者以这种方式与对象交互并不是真正的 Pythonic?
  • 如果你有一个对象的引用,你可以随心所欲地处理它。 Python 中的对象保护只是约定俗成的;该语言假设我们都是同意的成年人。搞乱 C 级结构是正确的(即根本不是 Pythonic)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2015-06-10
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多