面向对象封装

如何进行隐藏

在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)

类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式

class A:
    __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N
    def __init__(self):
        self.__X=10 #变形为self._A__X
    def __foo(self): #变形为_A__foo
        print('from A')
    def bar(self):
        self.__foo() #只有在类内部才可以通过__foo的形式访问到.

1.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果

2.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的。

3.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。

1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N

2.变形的过程只在类的定义是发生一次,在定义后的赋值操作,不会变形

复制代码
class A:
    __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N
    def __init__(self):
        self.__X=10 #变形为self._A__X
    def __foo(self): #变形为_A__foo
        print('from A')
    def bar(self):
        self.__foo() #只有在类内部才可以通过__foo的形式访问到.

a = A()
a.__D=1
print(a.__dict__)
复制代码

结果为:

 {'__D': 1, '_A__X': 10} 

同时,__可以私有方法,父类加了__,子类无法直接调用:

复制代码
class A:
    def __init__(self):
        self.__X=10 #变形为self._A__X
    def __foo(self): #变形为_A__foo
        print('from A')
    def bar(self):
        self.__foo() #只有在类内部才可以通过__foo的形式访问到.

class B(A):
    def __init__(self):
        pass
    def __foo(self):
        print('from B')

b=B()
b.bar()
复制代码

结果是:

 from A 

正常不私有时,会调用到b的foo函数:

复制代码
class A:
    def __init__(self):
        self.__X=10 #变形为self._A__X
    def foo(self): #变形为_A__foo
        print('from A')
    def bar(self):
        self.foo() #只有在类内部才可以通过__foo的形式访问到.

class B(A):
    def __init__(self):
        pass
    def foo(self):
        print('from B')

b=B()
b.bar()
复制代码

结果是:

1
from B

 

 

 

 

  

 

posted @   大川哥  阅读(124)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示