How do I access the variable inside a class method from another python file?

Question:

I have two python files main.py and conftest.py. I want to access a variable of a method of the class Test declared in main.py from a function declared in conftest.py.
I have tried a bit, but I know it’s wrong as I get a syntax error in the first place. Is there any way to do this?

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)
Asked By: Libin Thomas

||

Answers:

In the execution of your function newfunc() the first instruction dir=Test.test_setup() raise the following error:

dir=Test.test_setup()
TypeError: test_setup() missing 1 required positional argument: 'self'

This error referred to an attempt to execute a method of a class by attribute reference but it requests an argument which is in general an instance of that class.

To solve this and other errors and to try to answer to your question I think that it is enough to define save_dir as an attribute of the class Test, and after that instantiate an object of that class.
In your code saved_dir is a local variable of the method test_setup so it is not visible outside of that context.

I show you the 2 possible correct files:

File 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

Pay attention: don’t use directly the previous code because in main.py I have adjusted the value of new_dir according to my environment (see /home/frank/Selenium/Insights/timestamp/ instead of your D:SeleniumInsightstimestamp).

File conftest.py:

from main import Test

def newfunc():
    test_class = Test()
    test_class.test_setup()
    print(test_class.get_saved_dir())

newfunc()

If you want to access to the attribute saved_dir directly without the use of method get_saved_dir() (not very object oriented) the file conftest.py becomes:

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()

Accessing the attributes of a class by reference

This is a useful link (it is included in the tutorial of official Python documentation) about the access to a variable or a method of a class.

Previous link explains how to access to an attribute of a class by reference.
If we adapt this concept to this post we can access to the method test_setup of the class Test, by the following syntax:

f = Test.test_setup

If we print on the standard output the value of f we obtain:

print(f)

# this is the output
<function Test.test_setup at 0x7f93f54316a8>

and this means that f is a valid attribute reference to a function object. In particular I referred to the following sentence of the link:

MyClass.i and MyClass.f are valid attribute references, returning an integer and a function object, respectively.

Answered By: frankfalse

Variable must be declared as belonging to the class

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

Then calling it

def newfunc():
    dir=Test().test_setup()
    print(dir.saved_dir)
Answered By: surge10
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.