【问题标题】:Override __import__ in python在 python 中覆盖 __import__
【发布时间】:2015-09-07 00:27:23
【问题描述】:

当我动态导入派生类时,我需要在 python 中重写 __import__ 函数。 (我只能访问基类代码)。例如:

Servers=[]

class ServerBase(object):
    name='' #name of the specific server class, for each server class

    def __init__(self):
        self.connected = False
        self.name = self.__class__.__module__.capitalize()
        Servers.append(self)

在导入派生类时,我需要调用基类的 __init__ 将其添加到 Servers[] 列表中,因此在主模块中我调用时:

__import__('DerivedClassName')

基 __init__ 将被调用

【问题讨论】:

  • 为什么需要这个?为什么不直接使用生成派生类和实例的工厂函数?
  • 看不出来,这跟import有什么关系。
  • 我无权访问派生类或导入该派生类的主函数(仅基类)
  • @AlexGill:您调用一个工厂函数来导入派生类并在那里创建它的实例,然后比挂钩到每个导入更好地解决这个问题。
  • @AlexGill:否则你可以将一个新的__import__ 包装器注入到主函数全局变量中,但我认为这是最后的努力。您最好在该模块中对 DerivedClassName 全局进行猴子修补。

标签: python initialization derived-class base-class


【解决方案1】:

我最终对 Servers 类进行了元分类:

Servers=[]

''' Servers Metaclass that handles addition of servers to the list '''
class MetaServer(type):
    def __init__(self, name, bases, attrs):
        self.name = name.capitalize()
        Servers.append(self)
        super(MetaServer, self).__init__(name, bases, attrs)

class ServerBase:
    __metaclass__ = MetaServer
    name='' #name of the specific server class, for each server class

    def __init__(self):
        self.connected = False

这样每次导入派生类时都会调用 meta-init。 正是我想要的。 谢谢@MartijnPieters

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 2015-01-20
    • 2020-03-25
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多