python property用法

初识property

python中的property类可以让我们以处理变量的方式来调用函数

我们先感性地认识一下它。若有代码:

class Student:
    def __init__(self):
        self.__age = 19

Bob = Student()
print(Bob.__age)

结果为:

AttributeError: 'Student' object has no attribute '__age'

可以发现,我们从外部不能访问私有变量。关于变量的命名,可以参考https://blog.csdn.net/qq_45812220/article/details/137295390

而若我们把代码改为:

class Student:
    def __init__(self):
        self.__age = 19

    
    def age(self):
        return self.__age

Bob = Student()
print(Bob.age)

结果为

19

这里用到了装饰器,关于装饰器,可以参考https://blog.csdn.net/qq_45812220/article/details/137809943

可以发现,age()虽然是一个方法,但我们却通过类似变量的方式对它进行了访问,得到了它的返回值。这就是property最基本的使用

property进阶

在pycharm中输入property,ctrl+左键可查看property的官方说明文档。

"""
        Property attribute.
        
          fget
            function to be used for getting an attribute value
          fset
            function to be used for setting an attribute value
          fdel
            function to be used for del'ing an attribute
          doc
            docstring
        
        Typical use is to define a managed attribute x:
        
        class C(object):
            def getx(self): return self._x
            def setx(self, value): self._x = value
            def delx(self): del self._x
            x = property(getx, setx, delx, "I'm the 'x' property.")
        
        Decorators make defining new properties or modifying existing ones easy:
        
        class C(object):
            @property
            def x(self):
                "I am the 'x' property."
                return self._x
            @x.setter
            def x(self, value):
                self._x = value
            @x.deleter
            def x(self):
                del self._x
        # (copied from class doc)
        """

我们直接以它的typical use说法进行举例

class Student:
    def __init__(self):
        self.__age = 19

    def fget(self):
        return self.__age

    def fset(self,value):
        self.__age = value

    def fdel(self):
        del self.__age

    age = property(fget,fset,fdel)

Bob = Student()
print(Bob.age)
Bob.age = 24
print(Bob.age)

执行结果为:

19
24

我们通过往property中填入查询、修改和删除三个函数名,来得到了一个可操作的age对象,从而可以直接通过修改age来间接修改私有变量__age

我们刚才展示了查询和修改,现在我们展示删除

class Student:
    def __init__(self):
        self.__age = 19

    def fget(self):
        return self.__age

    def fset(self,value):
        self.__age = value

    def fdel(self):
        del self.__age

    age = property(fget,fset,fdel)

Bob = Student()
del Bob.age
print(Bob.age)

得到报错

AttributeError: 'Student' object has no attribute '_Student__age'

私有变量在外部甚至是不能查询的,而我们这里成功将它删除了,说明我们的删除操作成功了

property的讲解到此基本结束,下面是额外的使用技巧

如果读者只想要查询,而不需要其他操作,可以直接使用我们一开始的用法:

class Student:
    def __init__(self):
        self.__age = 19

    
    def age(self):
        return self.__age

Bob = Student()
print(Bob.age)

而如果只想要修改,可以使用setter,如下面代码所示:

class Student:
    def __init__(self):
        self.__age = 19

    
    def age(self):
        return self.__age

    .setter
    def age(self,value):
        self.__age = value

Bob = Student()
Bob.age = 44
print(Bob.age)

结果为

44

这里我们为了查询结果,,依然使用了@property。但这并不是必须的。

我们也可以单独使用删除操作,只需加上这一段代码即可,与之前完全一样。

    .deleter
    def age(self):
        del self.__age

关于property的讲解到此结束,如有错误,欢迎指出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值