python 2.7中的超级[重复]

Posted

技术标签:

【中文标题】python 2.7中的超级[重复]【英文标题】:super in python 2.7 [duplicate] 【发布时间】:2016-10-30 13:10:26 【问题描述】:

我正在尝试了解如何在 python 中使用super

class people:   
 name = ''  
 age = 0  
  __weight = 0  

 def __init__(self,n,a,w):  
    self.name = n  
    self.age = a  
    self.__weight = w  
def speak(self):  
    print("%s is speaking: I am %d years old" %(self.name,self.age))  


class student(people):  
 grade = ''  
 def __init__(self,n,a,w,g):  
    #people.__init__(self,n,a,w)  
    super(student,self).__init__(self,n,a,w)
    self.grade = g  

 def speak(self):  
    print("%s is speaking: I am %d years old,and I am in grade %d"%(self.name,self.age,self.grade))  


s = student('ken',20,60,3)  
s.speak()

以上代码出现如下错误:

---------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-147-9da355910141> in <module>()
     10 
     11 
---> 12 s = student('ken',20,60,3)
     13 s.speak()

<ipython-input-147-9da355910141> in __init__(self, n, a, w, g)
      3     def __init__(self,n,a,w,g):
      4         #people.__init__(self,n,a,w)
----> 5         super(student).__init__(self,n,a,w)
      6         self.grade = g
      7 

TypeError: must be type, not classobj

我很困惑为什么在这种情况下我不能使用super(student,self).__init__(self,n,a,w),以及为什么我必须使用people.__init__(self,n,a,w)

有什么帮助吗?

【问题讨论】:

self 传递给super,而不是__init__super(student, self).__init__(n,a,w) @MosesKoledoye 不,不是这样,即使使用 super(student, self).__init__(n,a,w),我仍然没有得到 classobj 错误 【参考方案1】:

您的基类people 应该派生自object 类,以使其成为一种新型类,这将允许super() 工作。

你应该使用super作为:

super(student, self).__init__(n,a,w)

旧式类的行为完全不同,我不理解它们

【讨论】:

好的,我对 people 类进行了一些更改:类 people(object),现在如果使用 super(student, self).__init__(self,n,a,w),我得到 TypeError: __init__() 正好接受 4 个参数(给定 5 个),这是为什么呢? 无需将self 作为参数传递给绑定的超级对象__init__ @IljaEverilä 从 init 中删除 self 有效!还有一个问题,你为什么称人(对象)为新风格?与以前的版本相比,这是 python 2.7 中的新功能吗? 请参阅文档中的"New-style and classic classes"。 @ikel 所以所有的“新式”类都出现在 python 2.2 左右。为了向后兼容,“旧样式”一直保留到 python2.7,并在 python3 中被删除。我认为您不应该浪费阅读有关它们的信息,因为它们现在已经“完成”了。只要记住总是给object基类,你就不会再有问题了。

以上是关于python 2.7中的超级[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我的元组中的那些小“u”是啥? (python 2.7)[重复]

Python 2.7函数导入[重复]

Python 2.7 列表理解泄漏变量名 [重复]

python中的多重继承与超级[重复]

Python继承2.7构造函数不起作用

如何在 MacOS 上明确卸载 python 2.7 [重复]