python中@property的用法

介绍两种操作类里私有属性值的方法

方法一是普通的方法:通过在类里声明函数从而实现对私有属性值的更改、查询以及对私有属性的删除。

方法二:通过@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





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值