【问题标题】:Auto-generate methods for subclasses为子类自动生成方法
【发布时间】:2011-10-23 15:08:02
【问题描述】:

我有几十节课。以下是其中两个:

class Class_A(ClassABC):

    def __init__(self):
        super().__init__()

    def from_B(self, b):
        #do stuff

    def from_C(self, c):
        #do stuff

    #...

    def to_B(self):
        rt = Class_B()
        rt.from_A(self)
        return rt

    def to_C(self):
        rt = Class_C()
        rt.from_A(self)
        return rt

    #...

class Class_B(ClassABC):

    def __init__(self):
        super().__init__()

    def from_A(self, a):
        #do stuff

    def from_C(self, c):
        #do stuff

    def to_A(self):
        rt = Class_A()
        rt.from_B(self)
        return rt

    def to_C(self):
        rt = Class_C()
        rt.from_B(self)
        return rt

    #...

 #class Class_C, Class_D, Class_E, etc,

这是ABC:

class ClassABC(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def __init__(self):
        #do stuff

我的问题是子类中的所有to_* 方法都遵循相同的模式,实现它们变得乏味。如果可能的话,我想在ClassABC 中自动生成它们,但到目前为止我失败了。我还尝试为子类创建一个类装饰器,但这也不起作用。然而,我已经设法使用 exec() 自动生成每个子类中的方法,但我宁愿让 ABC 生成它们或使用类装饰器。有没有办法做到这一点?

注意:所有类都在各自独立的模块中

【问题讨论】:

  • 也许将from_Afrom_B 重命名为from_self 之类的名称可能会更容易。你可以有一个像 {'A': Class_A, 'B': Class_B} 这样的字典来帮助你的班级装饰......
  • @JBernardo 不,我认为这不会有帮助。为了更清晰,我在示例代码中添加了更多内容。
  • 您能否更好地了解 Class_A.from_A 和 Class_q.from_A 之间的区别?
  • @cwallenpoole 没有Class_A.from_AClass_q.from_A 是从Class_AClass_q 的转换。
  • 好的,Class_A.from_BClass_A.from_C 有什么不同

标签: python python-3.x generative-programming


【解决方案1】:

首先,您的to_* 方法不起作用,因为您需要在参数列表的开头显式包含self 才能在方法主体中使用它。其次,我会采用类似于 JBernardo 的建议。

def to_class(self, cls):
    rt = cls()
    rt.from_class(self.__class__)
    return rt

def from_class(self, cls):
    #do stuff, with different things happening based on what class cls is; this may be a good place to use a dict of functions with the class or classname as keys

【讨论】:

  • 抱歉,我忘记在to_* 中包含self。这有什么改变吗?另外,出于性能原因,我想避免使用字典。
  • 你认为 dict 比较慢?不是,反正属性查找就是这样发生的。
  • @agf 谢谢,我对 Python 比较陌生,所以我认为 dict 会慢一些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多