Python3中类中的命名空间
我是Python新手,我想知道是否有方法将方法聚合到“子空间”中。我的意思是类似这样的语法东西:Python3中类中的命名空间
smth = Something()
smth.subspace.do_smth()
smth.another_subspace.do_smth_else()
我写的API封装和我将有很多非常类似的方法(仅适用于不同的URI),所以我虽然这将是很好的将它们放置在一些引用API请求类别的子空间。换句话说,我想在类中创建名称空间。我不知道这在Python中甚至是可能的,并且知道在Google中寻找什么。
我会很感激任何帮助。要做到这一点
一种方式是通过定义subspace
和another_subspace
作为回报,它们分别提供do_smth
和do_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,但是我怀疑性能增益是否值得。
这是一个非常优雅的解决方案并且按照预期工作,谢谢 – mDevv
这是有效的,但每次访问'smth.subspace'或'smth.another_subspace'时都会创建一个新的内部类对象,通过在方法中打印other_self可以看到OTOH,我认为这并不比实例方法通常在每次调用时重新绑定的事实更糟糕,但是如果这些内部类包含很多方法,它会减慢速度,不得不每次重新构建它们。 –
@mDevv:我不同意。如PM指出,这会每次创建一个新的类对象。至少将这些类移出该方法。接下来,你也不用担心共享状态。我会考虑重构你的API,不需要命名空间? –
这些实际上需要是方法吗?他们需要访问任何国家吗? 你能不能嵌套模块? –
像'do_smth'这样的方法是否需要像常规方法一样访问实例? – BrenBarn
我将登录信息存储为实例的属性。我需要从每种方法访问它们。也许有更好的方法来存储它们。 – mDevv