有条件地导入 python 类的片段

Posted

技术标签:

【中文标题】有条件地导入 python 类的片段【英文标题】:conditionally import pieces of a python class 【发布时间】:2018-09-18 20:32:44 【问题描述】:

按照this answer的第一个例子,我将我的类的实现拆分在不同的模块中,类似于

class MyClass:
    from impl0 import foo00, foo01
    from impl1 import foo10, foo11

我现在想基于仅在实例化时才知道的参数导入某些方法的两种不同实现中的一种或另一种,例如,

class MyClass:
    from impl0 import foo00, foo01

    def __init__(self, par):
        if par:
            from impl1 import foo10, foo11
        else:
            from alternative_impl1 ipmort foo10, foo11

然而,像之前的 sn-p 一样,foo10 和 foo11 的可见性仅限于 __init__ 函数。有没有办法在类方面实现这一目标?

【问题讨论】:

par 来自哪里?谁在设置它? 我认为,可能是 OP 希望我们假设 MyClass 为 MyClass(arg) @LutzHorn:我的意思是这个类是用其他地方的参数初始化的,那里使用了 MyClass。出于好奇,par 是物理模拟中的许多物理参数。用户从命令行传递它们,然后程序实例化类,将几个参数传递给构造函数。 【参考方案1】:

将模块分配给实例(或类)变量:

if par: 
   from impl1 import foo10, foo11
else:
   from impl2 import foo10, foo11
self.foo10 = foo10
self.foo11 = foo11

【讨论】:

不幸的是,当你这样做时,这些函数停止工作以及表现良好的类方法,即你不能将它们称为 self.foo10(parameters) 但你必须使用类似 self.foo10(自我,参数),我想避免。 你到底想做什么?条件导入似乎只是其中的一部分。 您可以使用staticmethod 装饰器使它们可以使用self.foo10(parameter) 调用。如果期望这些“方法”使用“self”作为第一个参数,则必须将它们从未绑定函数转换为绑定方法。一种天真的方法是更改​​它们分配给当前作用域的方式,即使用functools 模块中的partialself.foo10 = foo10 替换为self.foo10 = partial(foo10, self) @LutzHorn:我想做条件导入,仅此而已,因此不必更改对这些类方法的所有调用。 @Guybrush:使用静态方法会引发错误。但是,您使用 functools.partial 的提示是决定性的。

以上是关于有条件地导入 python 类的片段的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地导入 ES6 模块?

有条件地导入Vue中条件存在的文件

如何有条件地导入ES6模块?

有条件地将子组件导入到父模板 angular 5

Python从导入的模块中获取类的行号

Intellij idea 无法识别 python 3 中本地类的导入 [重复]