我有以下代码:
import numpy as np
class ClassProperty(property):
def __get__(self, cls, owner):
return self.fget.__get__(None, owner)()
def coord(cls, c):
if cls.dimension <= 2:
return c
else:
return c + [0]*(cls.dimension-2)
class Basis_NonI(object):
@ClassProperty
@classmethod
def zerocoord(cls):
return coord(cls, [0,0])
def __init__(self, dimension):
pass
class Basis_D(Basis_NonI):
dimension = 2
proj_matrix = np.array([Basis_D.zerocoord, Basis_D.zerocoord])
def __init__(self, dimension):
super(Basis_D, self).__init__(Basis_D.dimension)
基本上我希望 dimension
和 proj_matrix
成为 Basis_D
的类属性。
运行时出现如下错误:
proj_matrix = np.array([Basis_D.zerocoord, Basis_D.zerocoord])
NameError: name 'Basis_D' is not defined
--
我不明白的是,我可以在 init
中使用 Basis_D.dimension,那么为什么当我用它来定义时它不识别名称 Basis_D
proj_matrix
?
最佳答案
class
是一个可执行语句。首次导入模块时(对于给定进程),执行 class
语句顶层的所有代码,以这种方式定义的所有名称都收集到一个字典中,然后 class
对象是用这个字典创建的,最后绑定(bind)到类名。 IOW,此时:
class Basis_D(Basis_NonI):
dimension = 2
# HERE
proj_matrix = np.array([Basis_D.zerocoord, Basis_D.zerocoord])
该类尚未创建,也未绑定(bind)到名称 Basis_D
。
现在调用 __init__
时,类已经创建并绑定(bind)到模块级名称 Basis_D
,因此可以解析名称。
FWIW,你不应该在你的方法中直接引用 Basis_D
,而是 type(self)
(甚至 self
- 如果一个名字未解析为实例属性,它在类中查找)。
另外,为什么你坚持使用类属性?您是否了解您的 project_matrix
数组将在 Basis_D
的所有实例之间共享?
关于python - 名称错误 : name of the class not defined inside the class itself - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52894368/