Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对函数结果使用嵌套类python,有什么缺点吗?_Python_Nested Class - Fatal编程技术网

对函数结果使用嵌套类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的解释是正确的