Python @property介绍

  • 对于封装来说:通过实例.实例属性来访问实例的实例属性是不建议这么操作的
  • 正常情况下,实例的属性应该是隐藏的,只能通过类下的实例方法来间接访问
class Students:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def get_name(self):
        return self.__name

    def set_name(self,new_name):
        self.__name = new_name
		
s1 = Students('周杰伦',42)
print(s1.get_name())
s1.set_name('刘若英')
print(s1.get_name())

image

  • 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性image

  • property 作用是把实例方法,变成属性一样调用,即原本是实例.方法()变成实例.属性一样使用;另外还可以对实例属性进行限制,如属性只可读(有可读,可写,可删除)

  • 首先需要实例化property

class Students:
    def __init__(self,name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self,new_name):
        self.__name = new_name

    name = property(fget=get_name,fset=set_name,doc='测试property')



print(Students.name.__doc__)
s1 = Students('周杰伦')
print(s1.name)
  • 基本格式:属性名 = property(fget=None, fset=None, fdel=None, doc=None)
    fget:用于获取属性的方法
    fset:用于设置属性的方法
    fdel:用于删除属性的方法
    doc:属性的说明文档字符串

  • 初始化参数不是必填,不填就默认为None,填了就代表属性具体哪些权限

  • 还有一种更简单的方法实现上面的功能,就是直接使用装饰器,如@property(代表只读), @方法名.setter(代表可写),@方法名.deleter(代表可删除)

  • 此时方法名字就需要一致(因为代表的是一个属性,一个属性不可能有多个名字),另外这个名字不能和类里的其他属性名称一样,否则会报错

class Students:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, new_name):
        self.__name = new_name


s1 = Students('周杰伦')
print(s1.name)
s1.name = 'JAY'
print(s1.name)

image

  • 可以看出实例s1,原本(name的实例方法变成了属性一样的调用方式)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值