Python – Zugriff auf die parent-Attribut von child-Klassen-Methode ist seltsam

import random
import sys
import os
class Animal:
    __name = ""
    __height = 0
    __weight = 0
    __sound = ""

    def __init__(self, name, height, weight, sound):
        self.__name = name
        self.__height = height
        self.__weight = weight
        self.__sound = sound

    def toString(self):
        return "{} is {} cm tall and {} kilograms and say {}".format(self.__name,
                                                                     self.__height,
                                                                     self.__weight,
                                                                     self.__sound)

class Dog(Animal):
    __owner = ""
    def __init__(self, name, height, weight, sound, owner):
        self.__owner = owner
        super(Dog, self).__init__(name, height, weight, sound)

    def toString(self):
        return "{} is {} cm tall and {} kilograms and say {} His owner is {}".format(self.__name,
                                                                                      self.__height,
                                                                                      self.__weight,
                                                                                      self.__sound,
                                                                                      self.__owner)

spot = Dog("Spot", 53, 27, "Ruff", "Derek")
print(spot.toString())

Wann lief dieser code drucken:

    return "{} is {} cm tall and {} kilograms and say {} His owner is {}".format(self.__name,
AttributeError: 'Dog' object has no attribute '_Dog__name'

Aber wenn ich die toString-Methode in Dog-Klasse an der Seite mehr, etwa so:

class Dog(Animal):
    __owner = ""
    def __init__(self, name, height, weight, sound, owner):
        self.__owner = owner
        super(Dog, self).__init__(name, height, weight, sound)

        def toString(self):
            return "{} is {} cm tall and {} kilograms and say {} His owner is {}".format(self.__name,
                                                                                      self.__height,
                                                                                      self.__weight,
                                                                                      self.__sound,
                                                                                      self.__owner)

Druckt es richtig, zu sagen:

Spot ist 53 cm hoch und 27 Kilogramm und sagen Ruff

Warum ist das so?

Edit: ich habe gerade festgestellt, dass das, was gedruckt wurde Tier toString-Methode, nicht Hund toString-Methode.

  • Warum würden Sie tun, jedes Attribut privat?
  • Ich bin gerade ein python-tutorial und der Typ im tutorial war in der Lage, um es arbeiten mit privaten Attribute. link zum tutorial: youtube.com/…
  • Es ist ein schlechtes tutorial… Überprüfen Sie die Kommentare. Sie sind nicht der einzige, der vor diesem Fehler
  • Ich Stimme mit @pythad. Nutzt das video schlechte Terminologie, lehrt sehr unidiomatic Python, und macht falsche Annahmen darüber, wie die Klassen die auch wirklich funktionieren. Empfahl ich die Lektüre der Python-Dokumentation für einen kurzen überblick über die Klassen, und beobachten Sie ein besseres tutorial, wie diese eine. Ich habe nicht gesehen, alle von der Serie, aber der Autor Allgemeinen scheint zu lehren, Klassen und OOP Konzepte richtig.
InformationsquelleAutor Danin2 | 2017-07-11



2 Replies
  1. 3

    Nicht class-Attribute als default-Werte oder als „Erklärungen“, und verwenden Sie nicht __-Präfix Namen, es sei denn, Sie verstehen warum müssen Sie möglicherweise die solche Namen verwenden. Auch müssen Sie nicht toString; __str__ dient dem gleichen Zweck und wird automatisch aufgerufen, wie gebraucht.

    class Animal:
        def __init__(self, name, height, weight, sound):
            self.name = name
            self.height = height
            self.weight = weight
            self.sound = sound
    
        def __str__(self):
            return "{} is {} cm tall and {} kilograms and say {}".format(self.name,
                                                                         self.height,
                                                                         self.weight,
                                                                         self.sound)
    
    class Dog(Animal):
        def __init__(self, name, height, weight, sound, owner):
            super(Dog, self).__init__(name, height, weight, sound)
            self.owner = owner
    
    
        def __str__(self):
            s = super(Dog, self).__str__()
            return "{} His owner is {}".format(s, self.owner)
    
    spot = Dog("Spot", 53, 27, "Ruff", "Derek")
  2. 2

    Private Attribute sind nur, dass… Privat. Es gibt kein Konzept der Protected-Variablen in Python. Durch die Beschränkung der Variablen mit dem doppelten Unterstrich, Sie verhindern auch die Unterklassen auf Sie zugreifen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.