在python类中公开任意方法名称,以便IDE读取

时间:2018-05-07 10:16:14

标签: python class interface members

情况就是这样。假设你

from nastymodule import NastyObject1, NastyObject2, NastyObject3

并且这个NastyObject引擎盖下有一个奇怪的实现,由于接口不可分割的迷宫(COM,dll调用等),它没有干净地暴露它的方法,所以IDE无法建议他们。在文档中,您看到NastyObject1有方法do_thingNastyObject2有方法do_other_thing,实际上

NO1 = NastyObject1()
res = NO1.do_thing()
NO2 = NastyObject2()
res = NO2.do_other_thing()

完美地按照记录的方式工作。唯一的问题是,正如我所说,由于模糊的实现,IDE不知道此方法do_thing或该类的任何其他方法。现在,出于原因,我必须为所有这些NstObjWrapper编写唯一 NastyObject类,能够动态公开这些方法。

请注意,我已经写了NstObjWrapper的{​​{1}},所以

__getattr__

已经有效;我只需要找到一种方法来动态地使IDE(以及任何类型的检查员)意识到NOW1 = NstObjWrapper('NastyObject1') res = NOW1.do_thing() NOW2 = NstObjWrapper('NastyObject2') res = NOW2.do_other_thing() 具有NOW1方法而do_thing具有NOW2方法。

如有必要,

do_other_thing可以通过详尽的,硬编码的词典告知NastyObject的方法:

NstObjWrapper

但是由于类必须能够包装所有对象,所有对象都有不同的方法,所以不能只定义具有相同名称的方法,然后调用包装好的NastyObject方法。

这可能吗?你会怎么做?

1 个答案:

答案 0 :(得分:0)

解决这个问题的一个非常简单的方法是:

class my_class_func():
    def do_thing():
        pass
    def func2():
        pass
    def func3():
        pass
    def func4():
        pass

每个func对应一个你想要的func,然后告诉IDE你创建的类是那个特定类的类型,如下所示:

NOW1 = NstObjWrapper('NastyObject1') # type: my_class_func
res = NOW1.do_thing()

你会得到自动完成,因为我们编写“类型”注释的方式是根据pep惯例。

无论哪种方式,我都不确定这是最好的方式。