我有一个如下所示的类,我想访问位于该类函数内的一些变量。结构如下:
class access_all_elements:
def RefSelect_load_file():
reffname = askopenfilename(filetypes=(("XML files", "*.xml"),
("All files", "*.*") ))
if reffname:
ReferenceXML.insert(END,fileOpen.read())
recovering_parser = etree.XMLParser(recover=True)
AdasReference = etree.parse(reffname, parser=recovering_parser).getroot()
AdasReferenceString = etree.fromstring(ToStringAdasReference)
TimeReferenceTest = AdasReferenceString.findall("{http://www.google.com/car}bmw")
return TimeReferenceTest
def CopySelect_load_file():
#same code as above, but for loading another file in same GUI
代码说明
1)。 class access_all_elements:
类访问
2)。加载xml文件的类中的def RefSelect_load_file():
函数
3)。 ReferenceXML.insert(END,fileOpen.read())
在gui
4)。 AdasReference:
解析reffname
5)。 TimeReferenceTest:
这会从带有标签car
的xml中提取所有元素。此变量的输出如下所示:[<Element {http://www.google.com/car}bmw at 0x279ff08>, <Element {http://www.google.com/car}bmw at 0x279ffa8>.....]
5)。 return TimeReferenceTest
我想在调用函数时返回此变量的值
我想要的是什么:
此类之外还有另一个函数callback
,它使用位于access_all_elements
类中的变量之一,该变量为TimeReferenceTest
。我想在下面给出的函数中访问此变量的值。该值在上面的5th
点中提到。课外的功能如下所示:
def callback():
toplevel = Tk()
toplevel.title('Another window')
RWidth=Root.winfo_screenwidth()
RHeight=Root.winfo_screenheight()
toplevel.geometry(("%dx%d")%(RWidth,RHeight))
for i,j in zip(TimeReferenceTest,TimeCopyTest): #TimeCopyTest is also like TimeReferenceTest defined in above class under CopySelect_load_file() function,but not mentioned here
.......
简单地说,在RefSelect_load_file()
函数的整个实体之外我只想在执行TimeReferenceTest
函数时访问行for i,j in zip(TimeReferenceTest,TimeCopyTest)
中的变量callback
的值
我尝试了什么以及这是什么
首先,我在Tkinter中创建一个GUI并尝试绑定我用gui编写的所有代码。当有人按下按钮比较两个xml文件时,会调用Callback
。
到目前为止我尝试的是将两个函数封装到如上所示的同一类中以访问其变量的方法。我按照以下方式打电话给这个班:
c = access_all_elements()
c.RefSelect_load_file()
这里的问题是我知道这个函数是以打开文件对话框的方式定义的,但是当我在TimeReferenceTest
函数中调用它时,我只想返回callback
的值。那么有什么方法可以建议我在哪里可以访问该变量而不执行整个函数?
答案 0 :(得分:2)
我认为你可能正在寻找一些不存在的东西。如果您希望2个函数共享特定变量,则没有太多选项。
正如您已经提到的,一个选项是将两个函数放入一个类中,并使您想要的变量共享为“成员”:
Class MyFuncs:
def __init__(self, someVal):
self.val = someVal
def foo(self):
self.val = "FOO"
def bar(self):
self.val = self.val + "BAR"
另一种选择可能是使用闭包:
def GetFunctions():
sharedArray = [] # put shared values here
def foo():
sharedArray.append("FOO")
def bar():
sharedArray.append("BAR")
def printAll():
for word in sharedArray:
print(word)
return (foo,bar,printAll)
虽然我不推荐这种方法。
当然你也可以将函数作为参数传递给函数。如果函数没有逻辑耦合,那么这就是你应该做的事情。
如果这些选项都不适合您的想象,那么问题在于您的设计。您的代码应该以直观的方式组织,并且应该具有逻辑意义!如果你想要这个功能只是为了方便(也许你不想在你的函数上放太多参数)那么你可能找不到你想要的答案。
希望这有帮助! :)
答案 1 :(得分:1)
我认为你应该将函数作为实例的一部分而不是静态类方法。然后,您可以使TimeReferenceTest
也成为一个属性,然后您可以从实例外部访问该属性:
class Access_all_elements():
def __init__(self):
self.timeReferenceTest = None
self.timeCopyTest = None
def refSelect_load_file(self):
...
self.timeReferenceTest = adasReferenceString.findall(...)
...
...
c = Access_all_elements()
# get value as return value from function
trt = c.RefSelect_load_file()
print(" TimeReferenceTest = %s" % trt)
...
# use the value in callback
def callback():
...
for i,j in zip(c.timeReferenceTest,c.timeCopyTest): ...
这假设c
是全局的,但如果你传入它会更好。
(注意:你的命名方案似乎倒退,这使你的代码很难掌握.PEP8建议类应该以大写开头,函数和属性应该以小写开头。我试着在我的答案中采用它来制作代码对大多数python程序员来说更容易理解)