Python-从类中的函数访问变量

Python-从类中的函数访问变量,python,xml,class,Python,Xml,Class,我有一个如下所示的类,我想访问该类函数中的一些变量。结构如下: class access_all_elements: def RefSelect_load_file(): reffname = askopenfilename(filetypes=(("XML files", "*.xml"), ("All files", "*.*") )) if reffna

我有一个如下所示的类,我想访问该类函数中的一些变量。结构如下:

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) <代码>类访问\u所有元素:类访问内部的所有元素

2)
def ref选择加载文件():
加载xml文件的类内的函数

3)
ReferenceXML.insert(END,fileOpen.read())
gui内文本框中插入文件路径

4) <代码>适配器引用:解析位于
reffname

5)
TimeReferenceTest:
这将从带有标签的xml中提取所有元素
car
此变量的输出如下所示:
[,…]

5)
return TimeReferenceTest
我想在调用函数时返回此变量的值

我想要什么:

该类之外还有另一个函数,即
callback
,它使用位于
access\u all\u 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\u load\u file()
函数的整个实体中,我只想在执行
callback
is函数时,在第
行中访问变量
TimeReferenceTest
的值

我尝试了什么以及这一切的意义

首先,我正在Tkinter中制作一个GUI,并尝试将我用该GUI编写的所有代码绑定起来<当有人按下按钮比较两个xml文件时,会调用代码>回调

到目前为止,我尝试的是将两个函数封装到同一个类中的方法,如上图所示,以访问其变量。我以以下方式给班级打电话:

c = access_all_elements()
c.RefSelect_load_file()

这里的问题是,我知道这个函数是以打开文件对话框的方式定义的,但我想在
回调
函数中调用它时,只返回
TimeReferenceTest
的值。那么,有没有什么方法可以建议在不执行整个函数的情况下访问该变量

我想你可能在寻找一些不存在的东西。如果希望两个函数共享特定变量,则没有太多选项

正如您已经提到的,一个选项是将两个函数放入一个类中,并使您想要共享的变量成为“成员”:

另一种选择可能是使用闭包:

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)
虽然我并不推荐这种方法

当然,您也可以将内容作为参数传递到函数中。如果函数在逻辑上没有耦合,那么这就是你应该做的

如果这些选项都不符合您的喜好,那么问题在于您的设计。您的代码应该以直观的方式组织,并且应该具有逻辑意义!如果您只是为了方便而使用此功能(也许您不想在函数中添加太多参数),那么您可能找不到所需的答案


希望这有帮助!:)

我认为应该让函数成为实例的一部分,而不是静态类方法。然后,您还可以将
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程序员更容易理解代码)

您的问题不清楚。为什么不使用一次设置的类的成员(可能是类成员)而不是函数?我不完全理解你的问题,但一般来说,类中的方法可以访问在同一类的不同方法中创建的变量,只要它是作为类实例的属性创建的:例如,
self.thing\u i\u want\u be\u visible=which
。虽然我注意到您的方法没有
self
参数,这有点奇怪…@ReutSharabani此函数与tkinter中的按钮代码绑定,因此我保留了函数的原样,并创建了一个类,该类将涵盖其中的所有此类函数。我遵循了这个教程@Kevin yea you is right,但我很好奇为什么没有其他方法可以将位于一个类中的函数的值访问到另一个类外的函数。这样,我可能会在同一个类中声明所有函数。类外的作用域也可以访问该值,只要它们引用了类实例:
c.thing\u我希望\u可见
谢谢。但你的逻辑与中给出的差不多。但在这里,我想知道是否有可能在课外访问
val
的值。以
def foo(self)
val
的值为例,它位于整个类的inNo之外,这是不可能的。@DhruvJ,在这种情况下
val
是类
MyFuncs
实例的成员。这意味着,当您创建MyFuncs my doing类型的对象时,
myFuncsObj=MyFuncs()
myFuncsObj
在同一范围内的任何对象都可以使用
myFuncsObj.val
访问
val
。这回答了你的问题吗?你似乎不熟悉OOP。我是来帮忙的:)@MichaelSPriz很抱歉反应太晚。是的,我明白你的意思。我对在python中使用oop功能有点陌生。我正在尝试在我的程序中实现您的逻辑。谢谢你
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): ...