私有化之property装饰器方式

 接上一篇文章所讲的私有化属性,我们其实可以通过print(dir(w))来查看类中的属性,其中有 _worker__name等,这时通过打印w._worker__name其实可以访问私有属性,所以这是一个伪私有方法。见代码段底部。

#封装:1.私有化 2.公有set和get方法
#set赋值   get取值

class worker():
    def __init__(self,name,age,longfor):
        self.__name=name
        #私有化属性不能访问和修改,可以使用  
        self.__age=age
        self.__longfor=longfor
        
    def __str__(self):
        return '姓名:{},年龄:{},工时:{}.'.format(self.__name,self.__age,self.__longfor)
        #魔术方法,可通过打印实例对象获取信息,此时私有化方法属性可以使用,但不能访问和修改
        
    def setAge(self,age):
        if age>16 and age<28:     #对想要修改的属性做判断
            self.__age=age        #可通过set赋值方法来修改私有化属性值
            #还有一个好处是可以通过判断来限制修改私有化属性值
        else:
            print('年龄错误')
            
    def getName(self):
        return self.__name        #get方法通过return值来展示、访问私有化属性
    
        

w=worker('小熊',18,8)
#私有化属性可以通过使用的方式查看
print(w)        #姓名:小熊,年龄:18,工时:8.

#私有化属性不可访问 会报属性错误
#print(w.age)        #AttributeError: 'worker' object has no attribute 'age'

w.age=21    #age未改变
print(w)    #想修改私有化属性,不可行     姓名:小熊,年龄:18,工时:8.

w.setAge(29)  #年龄错误
w.setAge(22)
print(w)      #姓名:小熊,年龄:22,工时:8.
name=w.getName()
print(name)   #小熊

print(dir(worker))
print(dir(w))               #可展示类中的属性,其中有私有的属性,本质是加上了_类名__属性
#['__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__',
# '_worker__age', '_worker__longfor', '_worker__name', 'age',
# 'getName', 'setAge']
print(w._worker__age)  #22   当调用_类名__属性后,还是可以访问私有属性,所以这是一个伪私有

而在开发中,想通过未私有的随意赋值或访问方法一样来修改或访问私有属性,做到一个简便统一的效果,此时会用到property装饰器

property装饰器的使用,先

1.@property

    get方法

2.再@get方法名.setter

    set方法

具体使用见下代码块

修改后的代码及直接访问修改私有属性的结果:

class worker():
    def __init__(self,name,age,longfor):
        self.__name=name
        #私有化属性不能访问和修改,可以使用  
        self.__age=age
        self.__longfor=longfor
        
    def __str__(self):
        return '姓名:{},年龄:{},工时:{}.'.format(self.__name,self.__age,self.__longfor)
        #魔术方法,可通过打印实例对象获取信息,此时私有化方法属性可以使用,但不能访问和修改
    '''    
    def setAge(self,age):
        if age>16 and age<28:     #对想要修改的属性做判断
            self.__age=age        #可通过set赋值方法来修改私有化属性值
            #还有一个好处是可以通过判断来限制修改私有化属性值
        else:
            print('年龄错误')
            
    def getName(self):
        return self.__name        #get方法通过return值来展示、访问私有化属性
    '''
    @property                #整体先get后set,因为set依赖get
    def age(self):
        return self.__age
    @age.setter           #这里要用上面的方法名作为类名   
    def age(self,age):
        if age>16 and age<28:
            self.__age=age
        else:
            print('年龄错误')
        

w=worker('小熊',18,8)
#私有化属性可以通过使用的方式查看
#print(w)        #姓名:小熊,年龄:18,工时:8.

#私有化属性不可访问 会报属性错误
#print(w.age)        #AttributeError: 'worker' object has no attribute 'age'

#w.age=21    #age未改变
#print(w)    #想修改私有化属性,不可行     姓名:小熊,年龄:18,工时:8.

#w.setAge(29)  #年龄错误
#w.setAge(22)
#print(w)      #姓名:小熊,年龄:22,工时:8.
#name=w.getName()
#print(name)   #小熊

#print(dir(worker))
#print(dir(w))               #可展示类中的属性,其中有私有的属性,本质是加上了_类名__属性
#['__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__',
# '_worker__age', '_worker__longfor', '_worker__name', 'age',
# 'getName', 'setAge']
#print(w._worker__age)  #22   当调用_类名__属性后,还是可以访问私有属性,所以这是一个伪私有


print(w.age)    #18
w.age=21
print(w.age)    #21

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值