资讯专栏INFORMATION COLUMN

python学习笔记-使用@property、setter、deleter

CarterLi / 3318人阅读

摘要:在中,我们需要对外暴露一个成员变量的时候,我们往往需要对外部输入的值进行判断,以确保是符合我们的期望的。然后写一个用于供外部取得值一个函数用于供外部设置值,并对值进行一定的判断。但是这样实现了功能,但是的确使得调用变得比较麻烦。

在python中,我们需要对外暴露一个成员变量的时候,我们往往需要对外部输入的值进行判断,以确保是符合我们的期望的。

class Student(object):
    age = 20
    
student = Student()
print student.age
student.age = "hello"

上述这种写法虽然可以取到age属性,但是同时也可以对age设置任意值。所以并不合理。

那怎么解决了,我们可以把age变成私有的成员变量。然后写一个getter用于供外部取得age值;一个setter函数用于供外部设置age值,并对age值进行一定的判断。
例如:

class Student(object):
    def __init__(self):
        self._age = None

    def age_getter(self):
        return self._age

    def age_setter(self, age):
        if isinstance(age, str) and age.isdigit():
            age = int(age)
        else:
            raise ValueError("age is illegal")
        if isinstance(age,int):
            self._age = age

那么我就需要student.age_getter()取得age,student.age_setter()设置age值。但是这样实现了功能,但是的确使得调用变得比较麻烦。有什么地方可以改进吗?

这个时候我们可以在gettersetter后面定义一个成员变量age。例如

age = property(age_getter, age_setter)

这样我们就可以把age当成一个Student的属性来调用和赋值了。
例如:

student.age = "20"
print student.age

你觉得python只能这么写getter和setter了,那就图样图森破了。python还有逆天的装饰器来实现getter、setter、和deleter。
例如:

class Student(object):
    def __init__(self):
        self._age = None

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

    @age.setter
    def age(self, age):
        if isinstance(age, int):
            self._age = age
            return
        if isinstance(age, str) and age.isdigit():
            age = int(age)
            self._age = age
        else:
            raise ValueError("age is illegal")

    @age.deleter
    def age(self):
        del self._age


student = Student()
student.age = 20
print student.age

del student.age

上面的例子中用@property、x.setter x.deleter实现了属性的读取、赋值、和删除。当然您也可以只是实现其中的一个或者几个。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38315.html

相关文章

  • 《你不知道的javascript》笔记_对象&原型

    摘要:上一篇你不知道的笔记写在前面这是年第一篇博客,回顾去年年初列的学习清单,发现仅有部分完成了。当然,这并不影响年是向上的一年在新的城市稳定连续坚持健身三个月早睡早起游戏时间大大缩减,学会生活。 上一篇:《你不知道的javascript》笔记_this 写在前面 这是2019年第一篇博客,回顾去年年初列的学习清单,发现仅有部分完成了。当然,这并不影响2018年是向上的一年:在新的城市稳定、...

    seasonley 评论0 收藏0
  • Python 面向对象编程OOP (一) 类,对象,属性,访问权限

    摘要:面向对象编程之旅编程是什么大家好,作为小白,最近学习了很多编程的知识,因为脑容量有限,特此一一按照学习顺序记录下来,如果哪里有错误,还请大神尽快指出,以免误导他人。。。继承也允许把一个派生类的对象作为一个基类对象对待。 Python面向对象编程之旅 OOP编程是什么 大家好,作为小白,最近学习了很多Python OOP编程的知识,因为脑容量有限,特此一一按照学习顺序记录下来,如果哪里有...

    hiyayiji 评论0 收藏0
  • Python OOP 面向对象编程

    摘要:时代,如果需要手动继承,如多态多态是指,不同的子类对象调用相同的父类方法,会产生多态多样结果的编程特性。 参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封装 指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。这个一般都很简单,不需要多讲。 唯一要注意的就是:推荐从小往大开始封装、开发类。比如手枪...

    weknow619 评论0 收藏0
  • Python - @property 方法变属性

    摘要:属性有三个装饰器。当属性只有方法,则为只有只读属性。使用规则只读属性只有方法,在方法前加上可读可写属性有和方法,在方法上使用属性名。 @property @property是内置的装饰器,与普通装饰器原理是一样的,只不过返回的不是函数,而是类对象. @property负责把一个方法变成属性进行调用,保证对参数进行必要的检查。 属性有三个装饰器:setter、getter、dele...

    Alliot 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<