【问题标题】:Derive from a object从对象派生
【发布时间】:2017-05-26 01:05:56
【问题描述】:

我想知道是否可以从实例对象而不是类继承。如果是这样,我哪里出错了?

我有这个简单的代码。

class Fruit:
    def printFruit(self):
         printFruit("Fruit Class")

myFruitObj = Fruit()

class Apple(myFruitObj):
    def printApple("Apple Class")

myApple = Apple()

myApple.printFruit()
myApple.printApple()

Apple 继承自 myFruitObj 。 我得到了错误:

TypeError: object() 没有参数

如果我添加 __init__ 构造函数,我会得到:

__init__() 接受 1 个位置参数,但给出了 4 个。

【问题讨论】:

  • 你不能从实例继承...
  • 你不能那样做。你想完成什么?
  • 一个问题;为什么?这毫无意义!
  • 不过,您可以myFruitObj.__class__继承。
  • @Adam 谢谢..我已经想到了他们错过它的原因,我还给开发者开了一张票。他们将在新版本中修复它,但现在还可以。在 10K 的许可证上,我怀疑我的雇主会很快使用新版本。

标签: python inheritance


【解决方案1】:

您不能从类实例继承。这是不可能的。对象和类是两个不同的东西。

Python 调用类的__new__() 方法时,会创建一个对象。该特定对象的新实例由__new__() 返回。然后通过__init__() 方法初始化该实例。可以创建 same 类的多个实例。

然而,一个类只在导入期间创建一次。 Python 评估 class 语句,并创建一个新的 class 对象。当一个类对象继承自另一个类对象时,子类接收父类的所有属性和方法对象。

这样想:类是蓝图,对象是蓝图事物创建。当您创建那个东西时,您的设计将遵循蓝图的规范。

现在假设您想以某种方式修改原始蓝图的布局,但您仍想保留旧蓝图。您会根据原始蓝图创建的东西来创建新蓝图吗?不,当然不。您的设计将基于蓝图本身,而不是它们创建的内容。

课程也是如此。当您创建一个类的新对象时,该对象的基本结构是由该类创建的——蓝图。然而,就像上面的例子一样,当你想从一个类继承某些东西时,你不会尝试从类创建的对象继承。 为什么?因为你想继承类的一般结构——蓝图——而不是类instances之一的具体结构和具体属性。

【讨论】:

    【解决方案2】:
    myFruitObj.__class__
    

    这可以完成工作。

    class Fruit:
        def printFruit(self):
             printFruit("Fruit Class")
    
    myFruitObj = Fruit()
    
    class Apple(myFruitObj.__class__):
        def printApple("Apple Class")
    
    myApple = Apple()
    
    myApple.printFruit()
    myApple.printApple()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-26
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      相关资源
      最近更新 更多