簡體   English   中英

當我在PyCharm中運行此程序時,出現以下錯誤

[英]When I run this program in PyCharm I get the following errors

當我運行這段代碼時。 我收到以下錯誤

追溯(最近一次通話):文件“ C:/ Users / Nabeel Hussain Syed / PycharmProjects / Hello World / check.py”,行80,在print(spot.toString())中,文件“ C:/ Users / Nabeel Hussain Syed / PycharmProjects / Hello World / check.py“,第66行,在toString中返回“ {}高{}厘米,{}公斤,說{}。他的所有者是{}”。format(self .__ name,AttributeError: “狗”對象沒有屬性“ _Dog__name”

打開圖像的鏈接以檢查錯誤。

    class Animal:
    __name = None
    __height = 0
    __weight = 0
    __sound = 0

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

    def set_name(self, name):
        self.__name = name

    def set_height(self, height):
        self.__height = height

    def set_weight(self, weight):
        self.__weight = weight

    def set_sound(self, sound):
        self.__sound = sound

    def get_name(self):
        return self.__name

    def get_height(self):
        return str(self.__height)

    def get_weight(self):
        return str(self.__weight)

    def get_sound(self):
        return self.__sound

    def get_type(self):
        print("Animal")

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

cat = Animal('Whiskers', 33, 10, 'Meow')
print(cat.toString())

class Dog(Animal):
    __owner = ""

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

    def set_owner(self, owner):
        self.__owner = owner

    def get_owner(self):
        return self.__owner

    def get_type(self):
        print("Dog")

    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)


    def multiple_sounds(self, how_many=None):
        if how_many is None:
            print(self.get_sound())
        else:
            print(self.get_sound() * how_many)

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

名稱以雙下划線開頭的屬性被視為“私有”,並且不能從子類訪問。 您仍然可以使用_Animal__name類的名稱來訪問它們( Animal是在其中定義屬性的父類名稱),但這是一種不好的做法。

官方文檔中的更多信息: https : //docs.python.org/3.6/tutorial/classes.html#private-variables

雙下划線在Python中具有重要意義。 請從以前的堆棧溢出答案中查看此摘錄:

雙領先下划線

這實際上具有語法意義。 在類范圍內引用self .__ var1會調用名稱修飾。 從您的類外部,該變量將顯示為self._YourClassName__var1而不是self .__ var1。 並不是每個人都使用此功能-我們根本不在我的工作地點-對於簡單的課程,使用單個下划線就顯得有些荒謬和令人討厭。

但是,存在理由。 如果您使用大量繼承,如果僅使用單個前導下划線,則您將無法指示某人閱讀您的代碼,即“私有”變量與“受保護”變量之間的區別-甚至不意味着由子類訪問,子類可以訪問但外部世界不能訪問。 因此,在這種情況下,使用單個尾部下划線表示“受保護”,使用雙下划線表示“私有”可能是一個有用的約定(名稱改寫將允許子類在其子類中使用具有相同名稱的變量,而不會引起碰撞)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM