接上一篇文章所讲的私有化属性,我们其实可以通过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