python - 局部变量未传递给单独加载的类中定义的函数 - 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
,但它仍然没有“看到”a
或b
. a
将和定义b
为 的输入是不切实际的afunction(self, a, b):
。(afunction
被包中的另一个函数调用,我不想在afunction
这个另一个包的官方函数中编辑调用)。
如果需要,很乐意提供更多信息。我也很乐意提供实际示例而不是这个有点抽象的 MWE:我正在使用该FPDF
模块使用 python 制作 PDF 报告。该类定义添加图像、标题header
和footer
作者的 和 。和logo_path
都设置在主 python 脚本中title
。author
如果我将类定义移动到一个单独的文件中,那么它显然看不到变量logo_path
,title
和author
.
解决方案
你不能完全按照你想做的事(没有荒谬的反思)。但是,您确实有几个选择:
将变量放在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()
推荐阅读
- python-3.x - 无法安装公共 python 包,“没有错误代码 128”
- javascript - 如何在 React 的画布上连续流式传输视频?
- angular - 安装 'cordova-plugin-firebase' 失败:CordovaError: Using "requireCordovaModule" to load non-cordova
- sql - SQL查询未显示数据库中的任何更改
- c# - 如何通过 redis 服务器转换具有多种数据类型的 MemoryStream
- azure - 在 Azure VM 中的 localhost 上运行的访问服务
- d3.js - 将 d3.js sunburst 集成为数据工作室社区可视化
- stata - 控制汇总表中每个变量的小数
- python - 如何知道图像采集对象的形状
- c++ - 返回的 const 引用究竟何时被销毁?