【发布时间】:2017-01-19 17:49:48
【问题描述】:
TL;博士
基本上,问题是关于向用户隐藏我的模块具有类实现的事实,以便用户可以使用该模块,就好像它具有像my_module.func()这样的直接函数定义
详情
假设我有一个模块 my_module 和一个类 MyThing 。例如:
# my_module.py
class MyThing(object):
def say():
print("Hello!")
在另一个模块中,我可能会这样做:
# another_module.py
from my_module import MyThing
thing = MyThing()
thing.say()
但假设我不想做这一切。我真正想要的是 my_module 在 import 上自动创建 MyThing 的实例,这样我就可以执行以下操作:
# yet_another_module.py
import my_module
my_module.say()
换句话说,无论我在模块上调用什么方法,我都希望它直接转发到其中包含的类的默认实例。因此,对于模块的用户来说,似乎其中没有类,只是模块本身中的直接函数定义(其中函数实际上是其中包含的类的方法)。那有意义吗?有没有捷径可以做到这一点?
我知道我可以在my_module 中执行以下操作:
class MyThing(object):
def say():
print("Hello!")
default_thing = MyThing()
def say():
default_thing.say()
但是假设MyThing 有许多我想使用的“公共”方法,那么我必须为每个方法显式定义一个“转发”函数,这是我不想做的。
作为我上面问题的扩展,有没有办法实现我上面想要的,但也能够使用像from my_module import *这样的代码,并且能够直接在另一个模块中使用MyThing的方法,比如@ 987654334@?
【问题讨论】:
-
你可以但是你为什么要真的呢?你通常做这种事情的方式是
from something import something,然后只需使用something.(...),其中something是你的类实例... -
你可以使用
MyThing().say() -
@JonClements 我想你是对的,但我想这样做的原因是我正在将一些代码重构为类,并在代码库中加载了已经使用此模块的其他代码正如我在问题中描述的那样使用它,所以我不希望每个人都改变他们使用模块的方式,因为我将模块代码重构为类。 (我想将模块代码重构为类的原因是因为目前有很多代码异味,我可以使用类继承来重用部分代码。)