我想在我的模块上保持标签完成清理。我有一个返回类的函数。由于该类只能通过函数访问,因此我考虑将类嵌套在函数中,以将其隐藏在定义函数的模块中。是否有任何理由不这样做或您建议采用其他方法?
粗略代码:
def search():
#Nested class
#------------------------------
class SearchResult():
def __init__(self, data):
#do stuff
#---------------------------------
#do stuff - define data
return SearchResult(data)
答案 0 :(得分:2)
在函数内部定义类的缺点是无法从其他地方引用它。例如,您的其他代码无法使用isinstance
来测试值是否为SearchResult
实例,因为它们无法引用SearchResult
类。
另一个问题是您的返回值在技术上不会属于同一类型!这是因为每次运行search
函数时,它都会创建自己的SearchResult
类,该类与每个其他运行创建的SearchResult
类不同。因此,如果您有两个结果a
和b
,则type(a) == type(b)
将为false。在大多数情况下,这可能不重要,但有时可能会变得尴尬。
如果你以这种方式做事的唯一原因是你不希望课程出现在你的标签完成列表中,你可能能够以更好的方式隐藏它(尽管具体取决于什么可能取决于什么您正在使用的IDE以及其选项卡完成的工作原理。你可能想要尝试的东西是在类名前面加上下划线(_SearchResult
),这可能会使tab完成忽略它,因为前导下划线通常被理解为表示某些东西是“私有的”。
答案 1 :(得分:0)
有一些缺点。对于search
的每次调用,您将创建一个与其他类别不同的新SearchResult
类,例如:
>>> result_1 = search()
>>> result_2 = search()
>>> type(result_1) == type(result_2)
False
不可否认,您可能不应该在代码中执行此操作,但请记住,每个类也会占用内存,尽管这也可能无关紧要。在本地定义类也使它在全局不可访问,这在调试代码时可能很有用。
我回复chepner's recommendation以全局定义SearchResult
,但可以在其前面添加下划线以强调它是内部的。