我正在尝试使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的最后答案
"模块可以包含可执行语句和函数定义.这些语句用于初始化模块.它们仅在模块第一次导入时才执行"
对于静态类,我将放弃类并只创建一个模块级变量.
在 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)
回答刚才更新的问题,你在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预先概念进行协调.