classAnimal:
__ORE= 'Animal ore'@classmethod
def getore(cls):
# 由于是私有属性,所以此处的cls.__ORE已经被解释器替换成cls._Animal_ORE
print('class: {}\tclassORE: {}'.format(cls.__name__, cls.__ORE))classPig(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
classAnimal:
__ORE= 'Animal ore'@classmethod
def getore(cls):
# 由于是私有属性,所以此处的cls.__ORE已经被解释器替换成cls._Animal_ORE
print('class: {}\tclassORE: {}'.format(cls.__name__, cls.__ORE))classPig(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的私有属性了
做一个深入的实验
classAnimal:
__ORE= 'Animal ore'@classmethod
def getore(cls):
# 由于是私有属性,所以此处的cls.__ORE已经被解释器替换成cls._Animal_ORE
print('class: {}\tclassORE: {}'.format(cls.__name__, cls.__ORE))classPig(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类中
classAnimal:
__COUNT=5# 私有属性全部被替换
__AGE=9def __init__(self,name):
self.__AGE+=1self._name=name
self.__COUNT+=2
classHipo(Animal):
__COUNT=55_Animal__AGE=99# 此属性才真正替换了父类的__AGE属性
h=Hipo('hipo')
print(h.__dict__)
print(Hipo.__dict__)
print(Animal.__dict__)
父类的初始化方法__init__中如果有私有属性,子类最好将其override
重写__init__方法,也会增加父类的私有属性
classAnimal:
__COUNT=5# 私有属性全部被替换
__AGE=9def __init__(self,name):
self.__AGE+=1self._name=name
self.__COUNT+=2
classHipo(Animal):
__COUNT=55__AGE=88_Animal__AGE=99# 此属性才真正替换了父类的__AGE属性
def __init__(self,name):
super().__init__(name)
self.__AGE+=1self.__COUNT+=2h=Hipo('hipo')
print(h.__dict__)
print(Hipo.__dict__)
print(Animal.__dict__)