为什么我不能从嵌套的 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
而不用 self
或 Student
限定一样(Student.teacher
是在你的第一个例子中 Student
的 class 属性;在你的第二个例子中, Student.UnderStudent
是 Student
的 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()
在简单的情况下,我可以在 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
而不用 self
或 Student
限定一样(Student.teacher
是在你的第一个例子中 Student
的 class 属性;在你的第二个例子中, Student.UnderStudent
是 Student
的 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()