【问题标题】:Scope of classes inside of functions and classes inside of a class in pythonpython中函数内的类和类内的类的范围
【发布时间】:2013-07-16 20:17:37
【问题描述】:

我正在编写一些代码,并且有一个关于 python 的一般性问题

如果我有这样的事情:

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

这是否意味着 B 类仅对该函数是私有的,还是可以从 A 类的实例中调用?如果我有这样的代码:

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

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

我可以通过这样做d = A.B() 来调用它,对吗?

【问题讨论】:

    标签: python class scope


    【解决方案1】:

    要意识到class 语句只是创建了一个其值为类的变量。结果类的作用域的工作方式与变量作用域的工作方式相同,如果你只是做了一个普通的变量赋值,比如x = 2

    除非您另外指定,否则您在函数内创建的任何变量都是该函数的本地变量。因此,在函数中使用class 语句只会创建一个值为类的局部变量。它不能从函数外部访问。

    换句话说,这个:

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

    与此并没有什么不同:

    def foo():
        A = 2
    

    在这两种情况下,您都在函数内部创建了一个局部变量 A。在一种情况下它的值是一个类,而在另一种情况下它的值是一个整数,但在这两种情况下它都是一个局部变量并且在函数之外不存在。

    在您的第二个示例中,该类是在封闭类中创建的。在类命名空间内创建的变量是类属性,所以是的,您可以按照您的描述访问它。 (为什么要这样做是另一个问题。)换句话说,如上所述,这是:

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

    与此没有什么不同:

    class A(object):
        B = 2
    

    在这两种情况下,您都创建了一个具有类属性 B 的类 A。

    【讨论】:

      猜你喜欢
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2019-10-03
      相关资源
      最近更新 更多