Python3中类中的命名空间

问题描述:

我是Python新手,我想知道是否有方法将方法聚合到“子空间”中。我的意思是类似这样的语法东西:Python3中类中的命名空间

smth = Something() 
smth.subspace.do_smth() 
smth.another_subspace.do_smth_else() 

我写的API封装和我将有很多非常类似的方法(仅适用于不同的URI),所以我虽然这将是很好的将它们放置在一些引用API请求类别的子空间。换句话说,我想在类中创建名称空间。我不知道这在Python中甚至是可能的,并且知道在Google中寻找什么。

我会很感激任何帮助。要做到这一点

+1

这些实际上需要是方法吗?他们需要访问任何国家吗? 你能不能嵌套模块? –

+2

像'do_smth'这样的方法是否需要像常规方法一样访问实例? – BrenBarn

+0

我将登录信息存储为实例的属性。我需要从每种方法访问它们。也许有更好的方法来存储它们。 – mDevv

一种方式是通过定义subspaceanother_subspace作为回报,它们分别提供do_smthdo_smth_else对象的属性:

class Something: 
    @property 
    def subspace(self): 
     class SubSpaceClass: 
      def do_smth(other_self): 
       print('do_smth') 
     return SubSpaceClass() 

    @property 
    def another_subspace(self): 
     class AnotherSubSpaceClass: 
      def do_smth_else(other_self): 
       print('do_smth_else') 
     return AnotherSubSpaceClass() 

哪些你想要做什么:根据

>>> smth = Something() 
>>> smth.subspace.do_smth() 
do_smth 
>>> smth.another_subspace.do_smth_else() 
do_smth_else 

什么你打算使用这种方法,你可能想让SubSpaceClass成为一个singleton,但是我怀疑性能增益是否值得。

+1

这是一个非常优雅的解决方案并且按照预期工作,谢谢 – mDevv

+1

这是有效的,但每次访问'smth.subspace'或'smth.another_subspace'时都会创建一个新的内部类对象,通过在方法中打印other_self可以看到OTOH,我认为这并不比实例方法通常在每次调用时重新绑定的事实更糟糕,但是如果这些内部类包含很多方法,它会减慢速度,不得不每次重新构建它们。 –

+2

@mDevv:我不同意。如PM指出,这会每次创建一个新的类对象。至少将这些类移出该方法。接下来,你也不用担心共享状态。我会考虑重构你的API,不需要命名空间? –