介绍两种操作类里私有属性值的方法
方法一是普通的方法:通过在类里声明函数从而实现对私有属性值的更改、查询以及对私有属性的删除。
方法二:通过@property装饰器来实现对私有属性值的操作
方法一:
class People(object):
def __init__(self,name,age):
self.name=name
self.age=age
#私有属性
self.__number=0
#这三个函数的作用,就是为了在类声明的外部,可以访问到私有属性
#专门定义函数获取私有属性值
def num(self):
#返回私有属性值
return self.__number
#专门定义一个函数设置私有属性值
def set_nember(self,value):
#给对象的属性赋值
self.__number=value
# 专门定义一个函数删除私有属性
def delete_attr(self):
del self.__number
定义对象
p1=People('张三',22)
获得私有属性的值。在类声明的外部无法直接访问私有属性,所以通过num函数来获得私有属性的值
number=p1.num()
print(number)
改变私有属性的值。在类声明的外部无法直接访问私有属性,所以通过set_number函数来设置私有属性的值
p1.set_nember(1000)
print(p1.num())
删除私有属性的值。在类声明的外部无法直接访问私有属性,所以通过delete_attr函数来设置私有属性
p1.delete_attr()
方法二:
class People(object):
def __init__(self,name,age):
self.name=name
self.age=age
#私有属性
self.__number=0
#获取私有属性值 number=p1.number 会执行这个函数
@property
def number(self):
#返回私有属性值
return self.__number
#设置私有属性值 p1.number=666
@number.setter
def number(self,value):
#设置__number的值
self.__number=value
#删除私有属性 del p1.number 会执行这个函数
@number.deleter
def number(self):
#删除属性
del self.__number
查看私有属性的值
#会去执行@property装饰的number函数,函数执行完成之后返回一个结果
number=p1.number
print(number)
修改私有属性的值
#会去执行@number.setter装饰的number函数,在函数中设置__number属性的值
p1.number=666
# 会去执行@property装饰的number函数,函数执行完成之后返回一个结果
print(p1.number)
删除私有属性
#会去执行@number.deleter装饰的number函数,在函数中删除__number属性
del p1.number
# 会去执行@property装饰number函数,函数执行完成后返回一个结果
print(p1.number)
附:
正常的对象属性赋值
#对象.属性名=属性值
p1.name='李四'
获取对象的属性值
name=p1.name
删除对象的属性值
del p1.name
例子:
# -*- coding:utf-8 -*-
class People(object):
'''
给name属性赋值,值必须是字符串否则抛出异常
给age属性赋值,值必须是整数否则抛出异常
'''
def __init__(self,name,age):
#执行@name.setter装饰的函数,在函数中将声明对象时传递过来的name参数值赋值给_name属性赋值
self.name=name
self.age=age
#获取name属性的值
@property
def name(self):
#返回属性值时,也可以添加一些额外的功能
_name=self._name
#把姓氏换成*
_name=_name.replace(_name[0],'*')
#返回name属性的值
return _name
#设置name属性的值
@name.setter
def name(self,value):
#在赋值之前添加判断
if not isinstance(value,str):
#抛出异常
raise TypeError('People object.name,name must be a str!')
#设置name属性值
self._name=value
#删除name属性
@name.deleter
def name(self):
#添加一些额外的功能
if not hasattr(self,'_name'):
raise AttributeError('People object has no attribute "_name"')
# 删除_name属性
del self._name
@property
def age(self):
return self._age
@age.setter
def age(self,value):
if not isinstance(value,int):
raise TypeError('age must be a int value')
self._age=value
@age.deleter
def age(self):
if not hasattr(self,'_age'):
raise AttributeError('People object has no attribute "_age"')
del self._age
p1=People('张三',22)
# name的属性值 必须是一个字符串。否则抛出异常
p1.name='小星星星'
rs=p1.name
print(rs)
#删除对象的属性
# del p1.name
print(p1.age)
p1.age=30
print(p1.age)
del p1.age
# del p1.age