为什么我不能从嵌套的 class 引用 class 变量?

Why I can't refer to class variable from nested class?

在简单的情况下,我可以在 loh 函数中调用 teacher

class Student:
   teacher = 'Mrs. Jones'

   def __init__(self, name):
       self.name = name
    
def loh():
  print(Student.teacher)

loh()

### Mrs. Jones

但是,如果我接下来尝试这样做,则会出现“未定义”错误。为什么?

class Student:
  class UnderStudent:
    teacher = 'Mrs. Jones'
  def f():
    print(UnderStudent.teacher)
  f()

f 尝试在全局范围内查找 UnderStudent,但名称未在此处定义;它仅在 class 语句的命名空间中定义,该语句将名称转换为 class 属性。

class Student:
    class UnderStudent:
        teacher = 'Mrs.Jones'
    def f(self):
        print(self.UnderStudent.teacher)
        # or print(Student.UnderStudent.teacher)

嵌套 classes 在 Python 中很少见,因为对于在同一文件中包含多个 top-level classes 与其他一些语言没有限制。

你不能那样做,原因和你不能只说 teacher 而不用 selfStudent 限定一样(Student.teacher 是在你的第一个例子中 Student 的 class 属性;在你的第二个例子中, Student.UnderStudentStudent 的 class 属性,恰好是 class 本身)。 UnderStudent 在全局范围内不存在,它只存在于 Student 范围内,就像 teacher 一样。

您还必须在 Student 完全定义后调用 f ,因为直到您退出 Student 的定义范围, Student 在全局范围内不存在(所以你不能用它来查找 UnderStudent)。要修复,您可以这样做:

class Student:
  class UnderStudent:
    teacher = 'Mrs. Jones'
  def f(self):
    print(Student.UnderStudent.teacher)
    # or
    print(self.UnderStudent.teacher)

Student().f()