【发布时间】:2011-02-15 14:25:07
【问题描述】:
我正在尝试让 ImageLoader 类处理图像资源的加载和处理,如下所示:
class ImageLoader:
TileTable = __loadTileTable('image path', some other variable)
@staticmethod
def _loadTileTable(arg1, arg2):
blah blah
但是,在编译时我得到:NameError: name '_loadTileTable' is not defined
如果我用TileTable = ImageLoader.__loadTileTable('image path', some other variable) 替换第二行,那么我会得到NameError: name 'ImageLoader' is not defined
当我从 C# 转到 Python 时,我将使用带有静态方法的静态类来实现这一点。但是,我对在 python 中一般如何执行此操作持开放态度(即调用仅按功能分组在一起的静态库函数)。
更新: 在阅读了两个答案之后,我得到了一张图片,我正在尝试做的事情可能是不正确的。 我将如何实施 ImageLoader 以便我可以做到这一点:
假设瓦片表返回一个数组
module1.py
aTile = ImageLoader.TileTable[1]
module2.py
anotherTile = ImageLoader.TileTable[2]
理想情况下,我只填充一次 TileTable。
更新:
感谢所有答案,我在 python 模块 doco 中找到了仅填充 TileTable 一次的最后一个答案
"一个模块可以包含可执行文件 语句和函数 定义。这些陈述是 用于初始化模块。 它们仅在第一次执行 模块被导入某处”
至于静态类,我将放弃类,只创建一个模块级变量。
【问题讨论】:
-
当你在 Python 中使用
staticmethod时,你通常会做错事。如果您既不需要实例变量也不需要类变量(静态字段),只需使用模块级函数。 -
@delnan:我不完全同意。例如 Python 的默认
dict.fromkeys()。这些东西有合法的用例。 -
@delnan:我不同意。封装是 Joe 尝试使用的面向对象编程的主要租户。在 ImageLoader 类中保留仅与 ImageLoader 相关的函数是一种以编程方式对这种关系进行编码的有效方法(而不是因为它们在同一个模块中而隐式关联它们)。
-
@jathanism @Jason R. Coombs:是的,有合法的用例。但它们很少见。当与包含类有明确的联系时,例如例如,它用作具有有用名称的替代构造函数 - 但这里不是这种情况,该函数是私有的,很可能永远不会在其他任何地方调用它。而且,如果您来自静态方法是编写与实例无关的代码的唯一方法的语言,那么恕我直言,您应该将静态方法视为需要学习的东西(因为通常您不需要它们)蟒蛇)。
-
@Joe:“我将如何实施 ImageLoader 以便我可以做到这一点:”这是一个单独的问题。关闭这个——它在静态方法上。用你的真实问题打开一个新问题。