簡體   English   中英

Python幫助:從另一個類訪問靜態成員變量

[英]Python Help: Accessing static member variable from another class

我會盡力描述我遇到的問題。 我正在構建一個基於多個類並使用unittest框架的Python程序。 簡而言之,Main.py文件具有一個“ ValidateDriver”類,該類將“ driver”變量定義為ElementTree類型。 如果我直接將其指向需要解析的XML文件(即driver = ElementTree.parse(rC:\\ test.xml)),則可以從另一個類訪問它。 但是,實際上,直到進入ValidateDriver類中的Main函數,我才沒有從命令行傳遞的實際XML文件。 因此,在ValidateDriver類下,驅動程序實際上是driver = ElementTree,然后在主函數中將該變量重新分配給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

主要問題似乎是您的主腳本包裝在一個類中。 確實沒有任何理由,而且很令人困惑。

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

這應該超出類定義

這與“ 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:])

但是我強調這是非標准的,因此沒有必要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM