On 23/01/2012 20:27, Jonno wrote:


On Mon, Jan 23, 2012 at 2:09 PM, Ian Kelly <ian.g.ke...@gmail.com
<mailto:ian.g.ke...@gmail.com>> wrote:

    On Mon, Jan 23, 2012 at 12:44 PM, Jonno <jonnojohn...@gmail.com
    <mailto:jonnojohn...@gmail.com>> wrote:
     > I have a pretty complicated bit of code that I'm trying to
    convert to more
     > clean OOP.

    Then you probably should not be using globals.


I'm trying to rewrite the whole thing to get rid of my globals.


     > Without getting too heavy into the details I have an object which
    I am
     > trying to make available inside another class. The reference to
    the object
     > is rather long and convoluted but what I find is that within my class
     > definition this works:
     >
     > class Class1:
     >     def __init__(self):
     >
     >     def method1(self):
     >          foo.bar.object
     >
     > But this tells me "global name foo is not defined":
     >
     > class Class1:
     >      def __init__(self):
     >            foo.bar.object

    Where is foo actually stored?  Is it in fact a global, or is it
    somewhere else?  Please post the actual code.  I suspect that what's
    going on here is that you're assigning foo somewhere inside method1
    and so it is actually a local variable to that method, but there is no
    way to know that for certain from the minimal snippet provided.

The whole code is complex but here is where I define foo and bar:

class MyApp(wx.App):
     def OnInit(self):
         self.bar = MyFrame(None, -1, 'App Name')
         self.bar.Show(True)
         return True
foo = MyApp(0)
app.MainLoop()

There is nothing inside method1 except the foo.bar.object reference.

     > Obviously I want the object to be available throughout the class
    (I left out
     > the self.object = etc for simplicity).

    Do you mean that you want the same object to be available to all
    instances of Class1, or that you just want the object to be available
    to all methods within a single instance (and other instances might
    access other objects)?  In the first case, I would recommend storing
    foo in a class attribute; in the second case, an instance attribute.
    Either way, it would then be accessed simply as "self.foo".


Either way would work but the main issue is I can't seem to use foo or
foo.bar or foo.bar.object anywhere in __init__ or even before that in
the main class area.

This line:

foo = MyApp(0)

will create a 'MyApp' instance and then bind it to the name 'foo'.
Until that binding occurs, the name 'foo' doesn't exist.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to