python, 私有属性详解
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__)