0

I am writing some code and had a general question about python

If I have something like this:

class A():
       def __init__(self):
           self.name
           ...
       def doSomething(self):
           class B():
               def __init__(self):
                   self.name
                   ...
           c = B()
           c.whatever()

Does that mean that class B is private to that function only or can it be called from an instance of class A? On that note if I had some code like this:

 class A():
    class B():
         def __init__(self):
             self.name

    def __init__(self):
        self.name
        ...
        def doSomething(self):
        ...       

I can call it by doing this d = A.B() right?

1 Answer 1

1

The thing to realize is that the class statement just creates a variable whose value is a class. The way the resulting class's scope works is the same the way a variable's scope would work if you just did a normal variable assignment like x = 2.

Any variables you create inside a function are local to that function unless you specify otherwise. So using a class statement inside a function just creates a local variable whose value is a class. It can't be accessed from outside the function.

In other words, this:

def foo():
    class A(object):
        pass

is not really different from this:

def foo():
    A = 2

In both cases you create a local variable A inside the function. In one case its value is a class and in the other its value is an integer, but in both cases it's a local variable and has no existence outside the function.

In your second example, the class is created inside the enclosing class. Variables created inside a class namespace are class attributes, so yes, you can access it as you describe. (Why you'd want to do this is another question.) In other words, as above, this:

class A(object):
    class B(object):
        pass

is not that different from this:

class A(object):
    B = 2

In both cases you create a class A that has a class attribute B.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.