Python多重继承:动态做错了什么?

Lak*_*sad 0 python multiple-inheritance

根据这个答案,如何__new____init__应该在Python中工作,

我编写了这段代码来动态定义和创建一个新的类和对象.

class A(object):
    def __new__(cls):
      class C(cls, B):
          pass
      self = C()
      return self

    def foo(self):
      print 'foo'

class B(object):
    def bar(self):
      print 'bar'

a = A()
a.foo()
a.bar()
Run Code Online (Sandbox Code Playgroud)

基本上,因为__new__A返回一个继承A和B的动态创建的C,它应该有一个属性bar.

为什么C 不能有一个bar属性?

shy*_*ent 7

由于没有实际问题问题,我打算把它从字面上:

什么是动态做错了?
嗯,对于你的代码的用户来说,它实际上是不可读的,非常不透明和不明显的(包括你在一个月内:P).

根据我的经验(非常有限,我必须承认,不幸的是,我没有20年的编程能力),对此类解决方案的需求表明,类结构没有明确定义, - 意味着,几乎总是更好,更具可读性和不那么神秘的方式来做这些事情.

例如,如果您真的想要动态定义基类,最好使用工厂函数,它将根据您的需要返回适当的类.

另一个问题是:
动态做错了什么?
在您当前的实现中,它给出了"超出最大递归深度"错误.发生这种情况,因为A.__new__无限期地从内部调用自身(因为它从自身继承而来自B).

10:在里面A.__new__,"cls"设置为<class '.A'>.在构造函数中,您定义了一个类C,它继承自cls(实际上是A)和另一个类B.在实例化时C,它__new__被调用.由于它没有定义自己的__new__,__new__所以调用它的基类' .基类恰好是A.
20:GOTO 10


小智 7

解决无限递归:

class A(object):
  def __new__(cls):
    class C(cls, B):
      pass
    self = object.__new__(C)
    return self
Run Code Online (Sandbox Code Playgroud)

(感谢balpha指出实际的问题.)