Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用类方法设置类属性_Python_Oop - Fatal编程技术网

在python中使用类方法设置类属性

在python中使用类方法设置类属性,python,oop,Python,Oop,我有一个带有几个类属性的类,我想使用类方法初始化它。这是因为我在一个列表中有将近300个项目,我不希望它们出现在类定义中。由于我将拥有至少数百个此类对象,因此当它们不修改我定义的两个列表,并且只从它们中读取时,为每个实例读取并创建一个属性是没有效率的 class exampleClass: @classmethod def getUnsupportedEvents(cls): with open("randomfile.json") as file:

我有一个带有几个类属性的类,我想使用类方法初始化它。这是因为我在一个列表中有将近300个项目,我不希望它们出现在类定义中。由于我将拥有至少数百个此类对象,因此当它们不修改我定义的两个列表,并且只从它们中读取时,为每个实例读取并创建一个属性是没有效率的

class exampleClass:

    @classmethod
    def getUnsupportedEvents(cls):
        with open("randomfile.json") as file:
            return json.load(file)

    supportedEvents = []
    unsupportedEvents = getUnsupportedEvents()

我想使用classmethod
getUnsupportedEvents()
设置类属性
unsupportedEvent
,但是当我尝试以上述方式进行设置时,会出现以下错误:

unsupportedEvents = getUnsupportedEvents()

TypeError: 'classmethod' object is not callable

这看起来很简单,我只是忽略了一些非常简单的东西吗?

在类被完全定义之前,您正在尝试使用一个类方法。您必须在定义后延迟呼叫:

class exampleClass:

    @classmethod
    def getUnsupportedEvents(cls):
        with open("randomfile.json") as file:
            return json.load(file)

    supportedEvents = []

exampleClass.unsupportedEvents = exampleClass.getUnsuportedEvents()

如果要在类内赋值,则此代码应该为
getUnsupportedEvents
提供一个
NameError
,只需删除括号
unsupportedEvents=getUnsupportedEvents
@dhentris即可将函数绑定到变量,这不是我想要的。我希望它执行并返回要存储为类属性的函数值。如果我要将该类导入主程序中,会不会出现问题,因为该行代码在类之外?加载模块并导入符号。为了导入类,将加载模块并执行代码行。当然,它必须与该定义之后的类定义位于同一个模块中。即使我要从该模块导入特定的类,也会加载整个模块吗,即“from exampleModule import exampleClass”,其中exampleModule有几个类。这就是我说加载(完整)模块并导入(一些)符号的原因。事实上,
from mod import symb
首先加载完整的
mod
模块,然后在本地(或模块全局)符号表中导入
sym