Python 2.x Super INIT l'héritage ne fonctionne pas quand le parent n'hérite pas de l'objet

j'ai le code python 2.7 suivant:

class Frame:
    def __init__(self, image):
        self.image = image

class Eye(Frame):
    def __init__(self, image):
        super(Eye, self).__init__()
        self.some_other_defined_stuff()

j'essaie d'étendre le __init__() méthode pour que quand j'instancie un "oeil" il fait un tas d'autres choses (soi.some_other_defined_stuff ()), en plus de ce que Frame configure. Frame.__init__() doit courir en premier.

j'obtiens l'erreur suivante:

super(Eye, self).__init__()
TypeError: must be type, not classobj

dont je ne comprends pas la cause logique. Quelqu'un peut m'expliquer s'il vous plaît? J'ai l'habitude de taper "super" dans ruby.

21
demandé sur smci 2014-04-16 22:45:45

3 réponses

Il y a deux erreurs ici:

  1. super() ne fonctionne que pour les new-classes de style; utiliser object comme une classe de base pour Frame pour utiliser le nouveau style de la sémantique.

  2. vous devez quand même appeler la méthode overridden avec les bons arguments; pass in image__init__ appel.

donc le code correct serait:

class Frame(object):
    def __init__(self, image):
        self.image = image

class Eye(Frame):
    def __init__(self, image):
        super(Eye, self).__init__(image)
        self.some_other_defined_stuff()
40
répondu Martijn Pieters 2014-04-16 18:47:43

Frame doit s'étendre object parce que seules les nouvelles classes de style supportent super vous Eye comme ceci:

class Frame(object):
    def __init__(self, image):
        self.image = image

class Eye(Frame):
    def __init__(self, image):
        super(Eye, self).__init__(image)
        self.some_other_defined_stuff()
11
répondu myusuf3 2014-04-16 18:48:40

Hi voir mon travail codes pour python 2.7

__metaclass__ = type
class Person:
    def __init__(self, first, last, age):
        self.firstname = first
        self.lastname = last
        self.age = age

    def __str__(self):
        return self.firstname + " " + self.lastname + ", " + str(self.age)

class Employee(Person):
    def __init__(self, first, last, age, staffnum):
        super(Employee, self).__init__(first, last, age)
        self.staffnumber = staffnum

    def __str__(self):
        return super(Employee, self).__str__() + ", " +  self.staffnumber


x = Person("Marge", "Simpson", 36)
y = Employee("Homer", "Simpson", 28, "1007")

print(x)
print(y)
0
répondu Arjun Sharma 2018-01-13 07:43:19