[英]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.