有条件地导入 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
模块中的partial
将self.foo10 = foo10
替换为self.foo10 = partial(foo10, self)
。
@LutzHorn:我想做条件导入,仅此而已,因此不必更改对这些类方法的所有调用。
@Guybrush:使用静态方法会引发错误。但是,您使用 functools.partial 的提示是决定性的。以上是关于有条件地导入 python 类的片段的主要内容,如果未能解决你的问题,请参考以下文章