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__)
复制代码

 

 

 

posted @   ascertain  阅读(1400)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示