class Animal: __ORE= 'Animal ore' @classmethod def getore(cls): # 由於是私有屬性,所以此處的cls.__ORE已經被解釋器替換成cls._Animal_ORE print('class: {}\tclassORE: {}'.format(cls.__name__, cls.__ORE)) class Pig(Animal): __ORE='Pig ore' # @classmethod # def getore(cls): # print('class: {}\tclassORE: {}'.format(cls.__name__, cls.__ORE)) p=Pig() p.getore() # 得到是Animal的__ORE print(Pig.__dict__) # 只展現在自己類內部定義的屬性,不會展現父類屬性 # print(Animal.__dict__)

下面將父類的getore方法override
class Animal: __ORE= 'Animal ore' @classmethod def getore(cls): # 由於是私有屬性,所以此處的cls.__ORE已經被解釋器替換成cls._Animal_ORE print('class: {}\tclassORE: {}'.format(cls.__name__, cls.__ORE)) class Pig(Animal): __ORE='Pig ore' @classmethod def getore(cls): print('class: {}\tclassORE: {}'.format(cls.__name__, cls.__ORE)) p=Pig() p.getore() # 得到是Animal的__ORE print(Pig.__dict__) # 只展現在自己類內部定義的屬性,不會展現父類屬性 # print(Animal.__dict__)

getore獲取到的是Pig的私有屬性了
做一個深入的實驗
class Animal: __ORE= 'Animal ore' @classmethod def getore(cls): # 由於是私有屬性,所以此處的cls.__ORE已經被解釋器替換成cls._Animal_ORE print('class: {}\tclassORE: {}'.format(cls.__name__, cls.__ORE)) class Pig(Animal): __ORE='Pig ore' _Animal__ORE='Pig phony ORE' # @classmethod # def getore(cls): # print('class: {}\tclassORE: {}'.format(cls.__name__, cls.__ORE)) p=Pig() p.getore() # 得到是Animal的__ORE print(Pig.__dict__) # 只展現在自己類內部定義的屬性,不會展現父類屬性 # print(Animal.__dict__)
自定義一個跟替換后同名的屬性於Pig類中

class Animal: __COUNT=5 # 私有屬性全部被替換 __AGE=9 def __init__(self,name): self.__AGE+=1 self._name=name self.__COUNT+=2
class Hipo(Animal): __COUNT=55 _Animal__AGE=99 # 此屬性才真正替換了父類的__AGE屬性 h=Hipo('hipo') print(h.__dict__) print(Hipo.__dict__) print(Animal.__dict__)

父類的初始化方法__init__中如果有私有屬性,子類最好將其override
重寫__init__方法,也會增加父類的私有屬性
class Animal: __COUNT=5 # 私有屬性全部被替換 __AGE=9 def __init__(self,name): self.__AGE+=1 self._name=name self.__COUNT+=2
class Hipo(Animal): __COUNT=55 __AGE=88 _Animal__AGE=99 # 此屬性才真正替換了父類的__AGE屬性 def __init__(self,name): super().__init__(name) self.__AGE+=1 self.__COUNT+=2 h=Hipo('hipo') print(h.__dict__) print(Hipo.__dict__) print(Animal.__dict__)

