对函数结果使用嵌套类python,有什么缺点吗?
我想保持我模块上的制表符完成清洁。我有一个返回类的函数。由于该类只能通过函数访问,因此我考虑将该类嵌套在函数中,以便对定义函数的模块隐藏该类。是否有任何理由不这样做,或者您会推荐其他方法 粗略代码:对函数结果使用嵌套类python,有什么缺点吗?,python,nested-class,Python,Nested Class,我想保持我模块上的制表符完成清洁。我有一个返回类的函数。由于该类只能通过函数访问,因此我考虑将该类嵌套在函数中,以便对定义函数的模块隐藏该类。是否有任何理由不这样做,或者您会推荐其他方法 粗略代码: def search(): #Nested class #------------------------------ class SearchResult(): def __init__(self, data):
def search():
#Nested class
#------------------------------
class SearchResult():
def __init__(self, data):
#do stuff
#---------------------------------
#do stuff - define data
return SearchResult(data)
有一些缺点。对于
search
的每次调用,您将创建一个新的SearchResult
类,与其他类不同,例如:
>>> result_1 = search()
>>> result_2 = search()
>>> type(result_1) == type(result_2)
False
诚然,您可能不应该在代码中这样做,但请记住,每个类也会占用内存,尽管这也可能无关紧要。在本地定义类也会使其在全局范围内不可访问,这在调试代码时可能很有用
我希望全局定义
SearchResult
,但可能会在其前面加一个下划线,以强调它是内部的。在函数中定义类的一个缺点是无法从其他地方引用它。例如,您的其他代码不能使用isinstance
来测试某个值是否是SearchResult
实例,因为它们无法引用SearchResult
类
另一个问题是,您的返回值在技术上不是同一类型的!这是因为每次运行search
函数时,它都会创建自己的SearchResult
类,该类与彼此运行时创建的SearchResult
类不同。因此,如果您有两个结果,a
和b
,type(a)==type(b)
,则将为false。在大多数情况下,这可能并不重要,但有时可能会变得尴尬
如果这样做的唯一原因是不希望类显示在选项卡完成列表中,那么可以用更好的方法隐藏它(尽管具体方式可能取决于您使用的IDE及其选项卡完成的工作方式)。您可能希望尝试在类名前面加一个下划线(
\u SearchResult
),这可能会使制表符完成忽略它,因为按照惯例,前导下划线表示某些内容是“私有的”.为什么要对模块隐藏它
?我想他的意思是,当从模块导入中完成选项卡时,
它不会显示搜索结果
,因为在该功能之外永远没有理由创建独立的搜索结果
。我的意见是:在该功能之外定义搜索结果
函数,但将其命名为\u SearchResult
,以强调它是“私有”的,不是通用的。但另一方面,SearchResult
定义了什么方法?如果没有,为什么要定义一个类呢?只要让SearchResult
返回一个namedtuple
,甚至是一个简单的tuple。我同意,或者dict
@aruistante的解释是正确的