Python私有属性、私有方法

Python私有属性、私有方法

私有属性、方法——Python并没有真正的私有化支持,但可用下划线得到伪私有
在实际开发中,类的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到
私有属性就是类不希望公开的属性
私有方法就是类不希望公开的方法

Python 不能像 Java 那样使用 private 修饰符创建私有属性,但是 Python 有个简单的机制,能避免子类意外覆盖“私有”属性。
例如有一个名为 Dog 的类,这个类的内部用到了 mood 实例属性,但是没有将其开放。现在,创建了 Dog 类的子类:Beagle。如果你在毫不知情的情况下又创建了名为 mood 的实例属性,那么在继承的方法中就会把 Dog 类的 mood 属性覆盖掉。这是个难以调试的问题。
为了避免这种情况,如果以 __ mood 的形式(两个前导下划线,尾部没有或最多有一个下划线)命名实例属性,Python 会把属性名存入实例的 __ dict __ 属性中,而且会在前面加上一个下划线和类名。因此,对 Dog 类来说,__ mood 会变成 Dog_ mood;对 Beagle 类来说,会变成 _Beagle__mood。这个语言特性叫名称改写(name mangling)。
单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象(即类实例)和子类对象自己能访问到这些变量,需通过类提供的接口进行访问;不能用’from module import *'导入
双下划线 " 开始的是私有成员(变量、方法),意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

class Person:   
    _a = 'hello'  #保护变量,一般在类外不去访问
    #"单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象(即类实例)和子类对象自己能访问到这些变量,需通过类提供的接口进行访问;不能用'from module import *'导入
    __b = 'world'  ##私有变量
    #" 双下划线 " 开始的是私有成员(变量、方法),意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
    name = 'gaozhiyuan'
gaozhiyuan = Person()
print(Person.__dict__) #对于双下划线开头的私有属性Python 会把属性名存入实例的 __dict__ 属性中,而且会在前面加上一个下划线和类名
print(Person._a,gaozhiyuan._a)
gaozhiyuan._a = 7  #对实例属性进行修改并没有对类属性进行修改
print(gaozhiyuan._a,Person._a)#对保护变量仍然可以修改,只是遵守约定与规则在外部不去访问与修改,否则容易出问题
print(gaozhiyuan.name)
print(gaozhiyuan._Person__b)
#下面对实例属性进行修改并没有对类属性进行修改
gaozhiyuan._Person__b = 8  #私有方法和属性在外部不可以直接用属性或方法名调用,内部将私有方法和属性在前面增加了  "_类名"
print(gaozhiyuan._Person__b,Person._Person__b)
{'__module__': '__main__', '_a': 'hello', '_Person__b': 'world', 'name': 'gaozhiyuan', '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
hello hello
7 hello
gaozhiyuan
world
8 world

python实例可以直接调用Python的公有方法;私有方法和属性在外部不可以直接用属性或方法名调用,内部将私有方法和属性在前面增加了 “_类名”

print(dir(Person))
['_Person__b', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_a', 'name']

私有属性也可以进行修改,只是一般不去修改

#对于私有属性也可以进行修改,只是一般不去修改
class Person:   
    _a = 'hello'  #保护变量,一般在类外不去访问
    #"单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象(即类实例)和子类对象自己能访问到这些变量,需通过类提供的接口进行访问;不能用'from module import *'导入
    __b = 'world'  ##私有变量
    #" 双下划线 " 开始的是私有成员(变量、方法),意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
    name = 'gaozhiyuan'
gaozhiyuan = Person()
Person._a = 9
print(Person._a,gaozhiyuan._a)  #对类的保护变量行修改后,实例的属性也被修改
Person._Person__b = 10
print(Person._Person__b,gaozhiyuan._Person__b)#对类的私有属性行修改后,实例的属性也被修改
9 9
10 10
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值