python基础拾遗003--私有化的实现

xx: 公有化变量

_x:前面带一个下划线,只是标明是私有属性或者方法,对访问没有影响。

__x:避免与子类的属性命名冲突,无法在外部直接访问。(名字被重整成 _className__x)

注意:无法再外部直接访问,但是外部可以创建同名的变量。如下。这是新建的变量只属于该示例。

class Test(object):
    def __init__(self):
        self.__age=18

    def setAge(self,num):
        self.__age=num

    def getAge(self):
        return self.__age

if __name__=='__main__':
    myTest = Test()
   # print(test.__age) #这一行会报错: AttributeError: 'Test' object has no attribute '__age'
    myTest.__age=20
    print(myTest.__age)  #输出为20
    print(myTest.getAge()) #输出为18

而且,__双下划线实现私有化的方式只是简单的进行了重命名,dir(实例名)可以看到_Test__age这个属性,即双下划线定义的属性可以通过_classname__propertyName访问。

print(myTest._Test__age) #输出18

如何简单的获取,设置所谓的私有变量呢?出来上面给出的setAge()和getAge()的实现,python也给出了两种更简单的实现。

1.利用property函数

class Test(object):
    def __init__(self):
        self.__age=18

    def setAge(self,num):
        self.__age=num

    def getAge(self):
        return self.__age

    age = property(getAge ,setAge) #注意:getAge和setAge的顺序不能调换

if __name__=='__main__':
    myTest = Test()
    myTest.age=22
    print(myTest.age) #输出22
    print(myTest.getAge()) #输出22

2.利用property装饰器

class Test(object):
    def __init__(self):
        self.__age=18

    def getAge(self):
        return self.__age

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self,num):
        self.__age=num

if __name__=='__main__':
    myTest = Test()
    myTest.age=22
    print(myTest.age) #输出22
    print(myTest.getAge()) #输出22

x_:避免与python关键字冲突,如: class_ 不推荐使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值