首页 > 解决方案 > 局部变量未传递给单独加载的类中定义的函数 - python3

问题描述

我有一个主要的python文件:

mainFile.py

a = 1
b = 2

from MyClass import MyClass # import class here as variables used by MyClass will be defined above.
test = MyClass()
test.afunction()

并且类定义为:

MyClass.py

class MyClass():
    def afunction(self):
        return a + b

我希望它1+2=3在我跑步时返回mainFile.py。但是,我收到以下错误:

    return a + b
NameError: name 'a' is not defined

我可以在一个文件中简单地做到这一点:

a = 1
b = 2

class MyClass():
    def afunction(self):
        return a + b

test = MyClass()
test.afunction()

并运行此返回3。但是,考虑到我的类定义的长度,我希望它在一个单独的文件中。

我尝试过声明global a,但它仍然没有“看到”ab. a将和定义b为 的输入是不切实际的afunction(self, a, b):。(afunction被包中的另一个函数调用,我不想在afunction这个另一个包的官方函数中编辑调用)。

如果需要,很乐意提供更多信息。我也很乐意提供实际示例而不是这个有点抽象的 MWE:我正在使用该FPDF模块使用 python 制作 PDF 报告。该类定义添加图像、标题headerfooter作者的 和 。和logo_path都设置在主 python 脚本中titleauthor如果我将类定义移动到一个单独的文件中,那么它显然看不到变量logo_path,titleauthor.

标签: pythonpython-3.x

解决方案


你不能完全按照你想做的事(没有荒谬的反思)。但是,您确实有几个选择:

 

将变量放在MyClass的构造函数中(推荐)

我的类.py

class MyClass:
    def __init__(self, a=1, b=2):
        self.a = a
        self.b = b

    def afunction(self):
        return a + b

主文件.py

from MyClass import MyClass

a = 1
b = 2

test = MyClass(a, b)
test.afunction()

 

 

从 mainFile.py 中设置 MyClass.py 中的变量

我的类.py

a = 1
b = 2

class MyClass:
    def afunction(self):
        return a + b

主文件.py

import MyClass

MyClass.a = 1
MyClass.b = 2

test = MyClass()
test.afunction()

 

 

如果您确实想从 MyClass.py 中访问 mainFile.py 的变量

这是为了以防有人知道这是他们想要做的并找到这个问题。虽然确实存在这样做的有效用例,但它们很少而且相差甚远。(这就是前面提到的“荒谬的反思”)

我的类.py

from contextlib import suppress
import sys


_this_mod = sys.modules[__name__]


class MyClass:
    def afunction():
        for mod in sys.modules.values():
            for attr in dir(mod):
                if ((getattr(mod, attr) is _this_mod and mod is not _this_mod)
                        or getattr(mod, attr) is afunction):
                    with suppress(AttributeError):
                        return getattr(mod, 'a') + getattr(mod, 'b')

主文件.py

import MyClass

a = 1
b = 2

test = MyClass.MyClass()
test.afunction()


# or


from MyClass import MyClass

a = 1
b = 2

test = MyClass()
test.afunction()

推荐阅读