从python中的类变量调用class/static方法

Joe*_*Joe 7 python class

我正在尝试使ImageLoader类处理图像资源的加载和处理,如下所示:

class ImageLoader:
    TileTable = __loadTileTable('image path', some other variable)

    @staticmethod
    def _loadTileTable(arg1, arg2):
        blah blah
Run Code Online (Sandbox Code Playgroud)

然而,在编译我得到: NameError: name '_loadTileTable' is not defined

如果我替换第二行TileTable = ImageLoader.__loadTileTable('image path', some other variable)然后我得到NameError: name 'ImageLoader' is not defined

当我从C#转到Python时,静态类的静态类就是我用来实现它的.但是,我对如何在python中执行此操作持开放态度(即,仅通过其功能将调用静态库函数组合在一起).

更新: 阅读完两个答案后,我得到一张照片,我正在尝试做的事情可能不对.我将如何改变ImageLoader,以便我可以这样做:

假设tile表返回了一个数组

module1.py

aTile = ImageLoader.TileTable[1]
Run Code Online (Sandbox Code Playgroud)

module2.py

anotherTile = ImageLoader.TileTable[2]
Run Code Online (Sandbox Code Playgroud)

理想情况下,我只会填充一次TileTable.

更新:

感谢所有的答案,我找到了我在python模块doco中只填充一次TileTable的最后答案

"模块可以包含可执行语句和函数定义.这些语句用于初始化模块.它们仅在模块第一次导入时才执行"

对于静态类,我将放弃类并只创建一个模块级变量.

Jas*_*mbs 5

在 Python 中,首先执行类块中的代码,然后将生成的命名空间传递给类初始值设定项。你写的代码也可以写成:

TileTable = _loadTileTable(arg1, arg2)
@staticmethod
def _loadTileTable(arg1, arg2):
    pass # blah blah
ImageLoader = type('ImageLoader', (), {'TileTable': TileTable, '_loadTileTable': _loadTileTable})
del TileTable
del _loadTileTable
Run Code Online (Sandbox Code Playgroud)

可以看到,_loadTileTable 的调用出现在它的定义之前。在您的示例中,在类定义中,对 _loadTileTable 的调用必须在 _loadTileTable 的定义之后。

一种可能的解决方法是简单地重新排列类定义。

class ImageLoader:
    def _loadTileTable(arg1, arg2):
        pass # blah, blah

    TileTable = _loadTileTable('image path', other_var)
Run Code Online (Sandbox Code Playgroud)

请注意,我删除了“静态方法”,因为在调用 _loadTileTable 时,它​​是作为函数而不是方法调用的。如果您真的希望它在类初始化后可用,则可以在事后将其定义为静态方法。

class ImageLoader:
    def _loadTileTable(arg1, arg2):
        pass # blah, blah

    TileTable = _loadTileTable('image path', other_var)

    _loadTileTable = staticmethod(_loadTileTable)
Run Code Online (Sandbox Code Playgroud)


Dun*_*can 5

回答刚才更新的问题,你在Python中做TileTable的是在一个名为tile_table的模块中调用一个变量imageloader.完全没有理由把它放在一个类中.

那么你得到:

module1.py

import imageloader
aTile = imageloader.tile_table[1]
Run Code Online (Sandbox Code Playgroud)

module2.py

import imageloader
anotherTile = imageloader.tile_table[2]
Run Code Online (Sandbox Code Playgroud)

imageload.py看起来像:

def _loadTileTable(arg1, arg2):
    pass # blah blah
tile_table = _loadTileTable('image path', other_var)
Run Code Online (Sandbox Code Playgroud)

可以将Python模块视为其他语言中的单例实例(事实上它就是这样),并且您将能够将其与从其他语言继承的任何OO预先概念进行协调.