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属性?
由于没有实际问题的问题,我打算把它从字面上:
什么是动态做错了?
嗯,对于你的代码的用户来说,它实际上是不可读的,非常不透明和不明显的(包括你在一个月内: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指出实际的问题.)