Calling a variable inside a function of another class

Discussion in 'Python' started by Yigit Turgut, Jan 7, 2012.

  1. Yigit Turgut

    Yigit Turgut Guest

    class test(test1):

    def __init__(self, device):
    Yigit Turgut, Jan 7, 2012
    #1
    1. Advertising

  2. On Sat, 07 Jan 2012 07:00:57 -0800, Yigit Turgut wrote:

    > I am trying to call a variable located in a function of a class from
    > main but couldn't succeed.Any ideas?


    You cannot access local variables from outside their function. That's why
    they are called *local* variables.

    You probably want to access *attributes* of the class or the instance.
    You have to define them first -- you can't access something that doesn't
    exist.

    class Test:
    shared = 42 # Shared, class attribute
    def __init__(self):
    self.dt = 23 # Instance attribute, not shared.


    print(Test.shared) # prints 42

    However, print(Test.dt) fails because no instance has been created yet,
    and so there is no dt attribute. You have to create an instance first,
    then __init__ will run and create the attribute:

    instance = Test()
    print(instance.dt) # prints 23



    --
    Steven
    Steven D'Aprano, Jan 7, 2012
    #2
    1. Advertising

  3. Yigit Turgut

    Yigit Turgut Guest

    On Jan 7, 6:01 pm, Steven D'Aprano <steve
    > wrote:
    > On Sat, 07 Jan 2012 07:00:57 -0800, Yigit Turgut wrote:
    > > I am trying to call a variable located in a function of a class from
    > > main but couldn't succeed.Any ideas?

    >
    > You cannot access local variables from outside their function. That's why
    > they are called *local* variables.
    >
    > You probably want to access *attributes* of the class or the instance.
    > You have to define them first -- you can't access something that doesn't
    > exist.
    >
    > class Test:
    >     shared = 42  # Shared, class attribute
    >     def __init__(self):
    >         self.dt = 23  # Instance attribute, not shared.
    >
    > print(Test.shared)  # prints 42
    >
    > However, print(Test.dt) fails because no instance has been created yet,
    > and so there is no dt attribute. You have to create an instance first,
    > then __init__ will run and create the attribute:
    >
    > instance = Test()
    > print(instance.dt)  # prints 23
    >
    > --
    > Steven


    How about assigning the variable as global, wouldn't it be more
    effective?
    Yigit Turgut, Jan 7, 2012
    #3
  4. On Sat, 7 Jan 2012 08:18:10 -0800 (PST), Yigit Turgut
    <> wrote:

    >How about assigning the variable as global, wouldn't it be more
    >effective?


    "global somename" only tells the Python interpreter that all
    references WITHIN a function definition to "somename" really are
    references to "somename" at the MODULE level.


    -=-=-=-=- amodule.py

    name1 = 123
    name2 = 456
    name3 = 789

    def afunc(x):
    global name1
    z = x + name1 #okay, it is using the module name1
    name1 = z #still okay
    y = x + name2 #okay so far, will look up to the module level
    e = y + name3 #due to the next line, this will error
    name3 = e #no global, name3 is local, and above is undefined
    --
    Wulfraed Dennis Lee Bieber AF6VN
    HTTP://wlfraed.home.netcom.com/
    Dennis Lee Bieber, Jan 7, 2012
    #4
  5. Yigit Turgut wrote:
    > class test(test1):
    >
    > def __init__(self, device):
    > .
    > .
    > .
    > def _something(self, x=1)
    > self.dt = data
    >
    >
    > if __name__ == "__main__":
    > test.something.dt ???
    >
    > I am trying to call a variable located in a function of a class from
    > main but couldn't succeed.Any ideas?
    >


    if __name__ == "__main__":
    aTest = test(whateverdevice)
    print aTest.dt

    Some advices:

    - a common practice in python is to name classes in CamelCase ( read http://www.python.org/dev/peps/pep-0008/ )
    - if dt is a shortcut for data, it's a bad one.
    - default values are for loosers, they should be used only to keep backward compatibility (personal opinion, a lot of ppl would disagree)
    - "call" is usually reserved for method and function, or any callable object in python. What you're trying to do is to reference an object, not calling it.

    JM
    Jean-Michel Pichavant, Jan 10, 2012
    #5
  6. Yigit Turgut

    Terry Reedy Guest


    > Yigit Turgut wrote:
    >> class test(test1):
    >>
    >> def __init__(self, device):
    >> .
    >> .
    >> .
    >> def _something(self, x=1)
    >> self.dt = data
    >>
    >>
    >> if __name__ == "__main__":
    >> test.something.dt ???
    >>
    >> I am trying to call a variable located in a function of a class


    dt is an attribute of an instance of the class.
    t = test() # create instance
    t._something() # call method that assigns attribute to t
    t.dt # is not the value of dt for t

    --
    Terry Jan Reedy
    Terry Reedy, Jan 10, 2012
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page