[英]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.