【问题标题】:Python multiple inheritance: Whats wrong doing it dynamically?Python多重继承:动态地做错了什么?
【发布时间】:2010-01-08 09:27:07
【问题描述】:

基于this answer__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()

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

为什么C没有bar属性?

【问题讨论】:

  • 基于什么答案?您是否缺少链接?
  • 罗杰,多米尼克,是的,链接丢失了。现在适当地更新了问题。
  • 仍然没有看到问题。如果有您不理解的错误消息,请包含错误消息(如果是异常则回溯)。

标签: python multiple-inheritance


【解决方案1】:

Resolve无限递归:

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

(感谢balpha指出实际问题。)

【讨论】:

    【解决方案2】:

    由于 question 中没有实际的 question,我将按字面意思理解:

    动态执行有什么问题?
    好吧,它实际上是不可读的,极其不透明且对您的代码用户来说是不明显的(包括您在一个月内:P)。

    根据我的经验(非常有限,我必须承认,不幸的是我没有 20 年的编程经验),对此类解决方案的需求表明,类结构没有很好地定义,-意味着,几乎做这些事情总是一种更好、更易读且不那么神秘的方式。

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

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

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

    【讨论】:

      【解决方案3】:

      如果您的问题是“我怎样才能做到这一点”——这可行:

      class A(object):
          @classmethod
          def get_with_B(cls):
            class C(B, cls):
              pass
      
            return C()
      
          def foo(self):
            print 'foo'
      
      class B(object):
          def bar(self):
            print 'bar'
      
      a = A.get_with_B()
      a.foo()
      a.bar()
      

      如果您的问题是“为什么它不起作用”——那是因为您在调用 C() 时遇到了无限递归,这导致 A.__new__ 被调用,它再次调用 C() 等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-09
        相关资源
        最近更新 更多