python中的@property和property

@property作用

功能1:将方法变为属性(实际上是利用方法将属性变为私有属性)

class Person(object):

    def __init__(self,name,age=18):
        self.name=name
        self.__age=18 #私有属性前面加上双下划线

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

person=Person('wby')
print(person.name)
print(person.age)
person.age=19  #直接设置age属性,会报错
#Error:AttributeError: can't set attribute

功能2:提供私有属性外部修改方法

class Person(object):

    def __init__(self,name,ag):
        self.name=name,
        self.__age=18

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

    @age.setter    #属性.setter可以在外部设置属性值
    def age(self,age):
        if age<18:
            print('年龄不能小于18')
            return
        self.__age=age
        return self.__age


person=Person('wby',18)
print(person.name)
print(person.age)
print('----------------')
person.age=19
print(person.age)
print('----------------')
person.age=17
print(person.age)

property函数

x=property(getattr,setattr,delattr,doc)
Python中访问对象的属性可以这么做:实例名.变量名。但是有些人却不同意这种访问方法,他们觉得这样做破坏了封装的原则,对象的状态对于外部应该是隐藏的。因此,Python中更推荐使用私有特性,通过在名字前面加上双下划线,然后getter,setter方法访问这些特性。

然而,将“实例名.变量名”的方式改为使用getter、setter方法将使代码变得更加复杂臃肿。如果有一种方法能够使简单的访问特性又能保持代码的规范性就好了。property正是解决这一问题的方案。

class A:
    def __init__(self,size=10):
        print('init')
        self._size=size

    def getattr(self):
        print('getattr')
        return self._size

    def setattr(self,value):
        print('setattr')
        self._size=value

    def delsize(self):
        print('delsize')
        del self._size

    x = property(getattr,setattr,delsize)
    y = 1

a=A()
print('----------')
print(a.x)
print('----------')
print(a.y)
print('----------')
print(A.x)
print('----------')
print(A.y)
print('----------')
a.x=12
print(a.x)
init
----------
getattr
10
----------
1
----------
<property object at 0x000001E4CA4237C0>
----------
1
----------
setattr
getattr
12

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值