我有两个python文件main.py
和conftest.py
。我想从conftest.py
中声明的函数访问main.py
中声明的类Test
的方法的变量
我试过一点,但我知道这是错误的,因为我首先遇到了语法错误。有办法做到这一点吗?
main.py
class Test():
def test_setup(self):
#make new directory for downloads
new_dir = r"D:SeleniumInsightstimestamp}".format(timestamp=datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
# print(new_dir)
if not os.path.exists(new_dir):
os.makedirs(new_dir)
saved_dir=new_dir
conftest.py
from main import Test
def newfunc():
dir=Test.test_setup()
print(dir.saved_dir)
在执行函数newfunc()
时,第一条指令dir=Test.test_setup()
会引发以下错误:
dir=Test.test_setup()
TypeError: test_setup() missing 1 required positional argument: 'self'
此错误指的是试图通过属性引用执行类的方法,但它请求的参数通常是该类的实例。
为了解决这个和其他错误,并尝试回答您的问题,我认为将save_dir
定义为类Test
的属性,然后实例化该类的对象就足够了
在代码中,saved_dir
是方法test_setup
的局部变量,因此在该上下文之外不可见。
我给你看两个可能正确的文件:
文件main.py
from datetime import datetime
import os
class Test():
def __init__(self):
self.new_dir = ""
self.saved_dir = ""
def test_setup(self):
#make new directory for downloads
#new_dir = r"D:SeleniumInsightstimestamp}".format(timestamp=datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
timestamp=datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
self.new_dir = "/home/frank/Selenium/Insights/timestamp/" + timestamp
# print(new_dir)
if not os.path.exists(self.new_dir):
os.makedirs(self.new_dir)
self.saved_dir = self.new_dir
def get_saved_dir(self):
return self.saved_dir
注意:不要直接使用以前的代码,因为在main.py
中,我已经根据我的环境调整了new_dir
的值(请参阅/home/frank/Selenium/Insights/timestamp/
而不是您的D:SeleniumInsightstimestamp
(。
conftest.py文件:
from main import Test
def newfunc():
test_class = Test()
test_class.test_setup()
print(test_class.get_saved_dir())
newfunc()
如果您想在不使用方法get_saved_dir()
的情况下直接访问属性saved_dir
(不太面向对象(,则文件conftest.py
变为:
from main import Test
def newfunc():
test_class = Test()
test_class.test_setup()
# access directly to attribute saved_dir (not properly Object Oriented)
print(test_class.saved_dir)
newfunc()
通过引用访问类的属性
这是一个关于访问类的变量或方法的有用链接(包含在Python官方文档的教程中(。
上一个链接解释了如何通过引用访问类的属性。如果我们将这个概念应用于本文,我们可以通过以下语法访问类Test
的方法test_setup
:
f = Test.test_setup
如果我们在标准输出上打印f
的值,我们得到:
print(f)
# this is the output
<function Test.test_setup at 0x7f93f54316a8>
这意味着CCD_ 22是对函数对象的有效属性引用。我特别提到了链接的以下句子:
MyClass.i和MyClass.f是有效的属性引用,分别返回一个整数和一个函数对象。
变量必须声明为属于类
class Test():
def __init__(self):
self.new_dir = ""
self.saved_dir = ""
def test_setup(self):
#make new directory for downloads
self.new_dir = r"D:SeleniumInsightstimestamp}".format(timestamp=datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
# print(self.new_dir)
if not os.path.exists(self.new_dir):
os.makedirs(self.new_dir)
self.saved_dir=self.new_dir
然后称之为
def newfunc():
dir=Test().test_setup()
print(dir.saved_dir)