如何从另一个python文件访问类方法中的变量



我有两个python文件main.pyconftest.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)

相关内容

  • 没有找到相关文章

最新更新