python - 名称错误 : name of the class not defined inside the class itself - python

标签 python class methods attributes

我有以下代码:

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)

基本上我希望 dimensionproj_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/

相关文章:

python - 将装饰器的函数传递给 Python RQ

php - 将任何类或任何方法声明为 "final"的示例场景是什么?

objective-c - 在Objective C中子类化时需要实现的方法

C#:定义类变量、默认值和获取设置不起作用?

c++ - C++ 中的模板类……必需的技能集?

C++ 错误代码 C2065 : '<class name>' undeclared identifier, 即使它应该在另一个 .h 文件中声明

java - 抛硬币方法建议

python - 使用 pip 安装 SciPy

python - 'utf- 8' can' t 解码位置 0 : invalid start byte 中的字节 0xc0

python - 为什么pygame不会画圆?