【问题标题】:Python :: Attribute in superclass not available in inheriting subclassPython :: 超类中的属性在继承子类中不可用
【发布时间】:2015-11-23 22:27:13
【问题描述】:

我想知道为什么下面会失败;基本上,继承的子类 (SubClass) 似乎无法访问它所继承的超类 (SuperClass) 中的属性。

顺便说一下,下面的所有三个文件都在同一个目录中,为了完整起见,我使用的是 Python3。

有什么想法吗?我认为这是非常简单的事情。谢谢!

超类(./super_class.py 中的SuperClass ...

class SuperClass(object):

   def __init__(self):
      self.varSuper = 'varSuper_value'

继承的子类(./sub_class.py中的SubClass ...

from super_class import SuperClass

class SubClass(SuperClass):

  def __init__(self):
     super(SuperClass, self).__init__()
     self.varSub = 'varSub_value'

驱动程序/测试程序脚本(./driver.py) ...

#! /usr/bin/env python3

from sub_class import SubClass

print(SubClass().varSub)    # Works: "varSub_value"
print(SubClass().varSuper)  # Excepts: I expected "varSuper_value"

例外...

user@linux$ ./driver.py
varSub_value                                  <--- GOOD
Traceback (most recent call last):
  File "./driver.py", line 6, in <module>
    print(SubClass().varSuper)                <--- NO GOOD
AttributeError: 'SubClass' object has no attribute 'varSuper'

【问题讨论】:

  • 你应该在 python 3 中不带参数地调用super()
  • 或使用 正确 类型 - super( SubClass , self)
  • 感谢 Sebastian 强调 Python2 和 Python-3 使用 super() 的区别。

标签: python inheritance subclass superclass


【解决方案1】:

您使用了错误的super() 函数。您应该使用:

super(SubClass, self).__init__()

或者在python3中

super().__init__()

按照你写的方式,你是在父类之后开始 MRO,而不是在你自己的类之后..

【讨论】:

    【解决方案2】:

    在继承的子类中(./sub_class.py 中的SubClass,改变这个:

    from super_class import SuperClass
    
    class SubClass(SuperClass):
    
      def __init__(self):
         super(SuperClass, self).__init__()   # <---- INCORRECT. CHANGE THIS.
         self.varSub = 'varSub_value'
    

    到这里:

    from super_class import SuperClass
    
    class SubClass(SuperClass):
    
      def __init__(self):
         super(SubClass, self).__init__()   # <---- TO THIS in python-2 (also still valid in Python-3)
         super().__init__()                 # <---- OR THIS for python-3 (New style in python-3)
         self.varSub = 'varSub_value'
    

    顺便说一句,python-3 的新咒语避免了键入错误类的可能错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 2020-11-08
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多