Python帮助:从另一个类访问静态成员变量

时间:2013-08-01 23:09:41

标签: python

我会尽力描述我遇到的问题。我正在构建一个基于多个类构建的Python程序并使用unittest框架。简而言之,Main.py文件有一个“ValidateDriver”类,它将“driver”变量定义为ElementTree类型。如果我直接将其指向我需要解析的XML文件(即driver = ElementTree.parse(rC:\ test.xml)),那么我可以从另一个类访问它。但是,实际上我没有从命令行传入的实际XML文件,直到你到达ValidateDriver类中的Main函数。所以在ValidateDriver类下,驱动程序实际上是driver = ElementTree,然后在main函数中我将该变量重新分配给ValidateDriver.driver = ElementTree.parse(args.driver)。然而,这是关键。当我去另一个类并尝试调用ValidateDriver.driver时,我没有“findall”方法/属性可用。同样,唯一可行的方法是执行以下操作:ElementTree.parse(rC:\ test.xml))。如果我在C#中做到这一点它会起作用,但我是Python的新手,这就是我的屁股。任何帮助/建议表示赞赏。我已经包含了这两个类的代码。

主要功能:

import sys
import argparse
import xml.etree.ElementTree as ElementTree
import unittest
import Tests.TestManufacturer


class ValidateDriver:
    driver = ElementTree

    def main(argv):
        parser = argparse.ArgumentParser(description='Validation.')
        parser.add_argument('-d', '--driver', help='Path and file name xml file', required=True)
        parser.add_argument('-v', '--verbosity',
                            help='Verbosity for test output.  1 for terse, 2 for verbose.  Default is verbose',
                            default=2, type=int)
        #args = parser.parse_args()
        args = r'C:\test.c4i'
        #print ("Validate Driver: %s" % args.driver)
        #print ("Verbosity Level: %s" % args.verbosity)

        ValidateDriver.driver = ElementTree.parse(r'C:\test.c4i')

        loader = unittest.TestLoader()
        suite = loader.loadTestsFromModule(Tests.TestManufacturer)


        runner = unittest.TextTestRunner(verbosity=2) # TODO Remove this...
        # TODO Uncomment this...  
        runner = unittest.TextTestRunner(verbosity=args.verbosity)
        result = runner.run(suite)


    if __name__ == "__main__":
        main(sys.argv[1:])

其他类,测试制造商:

import unittest
import Main


manufacturer = ['']


class Tests(unittest.TestCase):

    # Test to see if Manufacturer exists.
    def test_manufacturer_exists(self):
        for m in Main.ValidateDriver.driver.findall('./manufacturer'):
            print m.text

产生以下错误:

C:\Python27\python.exe C:\Users\test\PycharmProjects\Validator\Main.py
Traceback (most recent call last):
  File "C:\Users\test\PycharmProjects\Validator\Main.py", line 22, in <module>
    class ValidateDriver:
  File "C:\Users\test\PycharmProjects\Validator\Main.py", line 65, in ValidateDriver
    main(sys.argv[1:])
  File "C:\Users\test\PycharmProjects\Validator\Main.py", line 36, in main
    ValidateDriver.driver = ElementTree.parse(r'C:\test.c4i')
NameError: global name 'ValidateDriver' is not defined

Process finished with exit code 1

2 个答案:

答案 0 :(得分:0)

主要问题似乎是你的主脚本被包装在一个类中。这真的没有理由,而且非常令人困惑。

if __name__ == "__main__":
    main_object = ValidateDriver()
    main_object.main(sys.argv[1:])

这应该超出班级定义

答案 1 :(得分:0)

这与“findall”无关。问题是,在您尝试访问它时,类本身尚未完全声明。在python中,文件从上到下读取。例如,这是不允许的:

if __name__ == "__main__":
    f()

def f():
    ...

f的调用必须在声明后发生在文件的底部。

你在使用ValidateDriver所做的是类似的,因为直到它的主体中的语句被执行才定义类(这与函数不同,函数当然,它们的主体在它们之前不会被执行叫做)。您在类主体内调用main(sys.argv[1:]),而该主体又会尝试访问尚不存在的ValidateDriver.driver

优选地,main函数以及调用它的代码应该在类之外。据我所知,该类根本不需要存在(这不是C#或Java - 您可以直接在模块级别放置代码而无需类容器)。如果您坚持将其作为静态方法放在类中,则必须将其定义为类方法:

@classmethod
def main(cls, argv):
    ...

然后可以调用(在类定义之外),如:

ValidateDriver.main(sys.argv[1:])

但我强调这是非标准的,不应该是必要的。