在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python/ 一個(gè)類(lèi)繼承的問(wèn)題

一個(gè)類(lèi)繼承的問(wèn)題

寫(xiě)了一個(gè)父類(lèi) Animal,用 Cat 去繼承了 Animal,并為 Cat 新增了一個(gè)方法 eating()

class Animal(object):
  
    def __init__(self, name):
        self.__name = name
    
    def set_name(self, name):
        self.__name = name
  
    def running(self):
        print(self.__name,'is running!')
    

class Cat(Animal):
  
    def eating(self):
        print(self.__name,'is eating!')
cat = Cat('Doll')
cat.running()
cat.eating()

希望 cat.eating() 能夠輸出 Doll is eating!,但是卻報(bào)錯(cuò):

Doll is running!
Traceback (most recent call last):
  File "python", line 20, in <module>
  File "python", line 16, in eating
AttributeError: 'Cat' object has no attribute '_Cat__name'

求大大解答,沒(méi)看懂這個(gè)錯(cuò)誤,感謝!

回答
編輯回答
笑浮塵

你把前邊的self.__name下劃線去掉應(yīng)該就好了吧。__xxx代表的是xxx是一個(gè)私有屬性。
即self.__name=>self.name

2017年8月2日 08:53
編輯回答
爆扎

恭喜你即將學(xué)到一個(gè)python機(jī)制了。這個(gè)機(jī)制是這樣的,因?yàn)閜ython本身對(duì)類(lèi)屬性沒(méi)有所謂的私有的概念,這意味著任何人都可以查看類(lèi)的屬性,因此出了一個(gè) 名稱(chēng)改寫(xiě) 的機(jī)制。

Python 解釋器在運(yùn)行時(shí)自動(dòng)把私有屬性 __x (即雙下劃線開(kāi)頭) 的屬性重命名為 _MyClass__x 。這樣別人用 __x 來(lái)讀取時(shí)就會(huì)報(bào)出沒(méi)有這個(gè)屬性的異常。從而達(dá)到“私有”。其實(shí)這種機(jī)制如果懂了也會(huì)被惡意讀取的。

如果題主覺(jué)得這個(gè)機(jī)制不好理解,建議就不要使用雙下劃線開(kāi)頭的作為屬性了。

2018年1月4日 15:23
編輯回答
來(lái)守候
class Animal(object):
    def __init__(self, name):
        self.name = name

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

    def running(self):
        print(self.name, 'is running!')


class Cat(Animal):
    def eating(self):
        print(self.name, 'is eating!')


cat = Cat('Doll')
cat.eating()
cat.running()

把__name里的雙下劃線去掉。

2018年3月2日 01:24