美文网首页
python 元类编程(1) Property

python 元类编程(1) Property

作者: eeert2 | 来源:发表于2019-08-02 18:42 被阅读0次

有时候,我们希望对对象的属性有更强的控制:比如希望某个值在一定的范围内(比如温度,年龄等),或者希望赋值的时候要是某个类型的值,再比如希望某个值根据另外的属性值动态地调整(表示身体健康状况的属性要根据体温变化)。那么我们可以使用 python 的 property 装饰器。

以上是比较官方的说明,如果你对Java有了解,那么应该知道Java中属性都是私有的,对外提供 gettersetter方法。python 的property 装饰器也类似与此,只不过封装后的函数或者方法不再通过函数名()来访问,而是直接像属性一样使用。

一、怎么使用 @property装饰器

例如:

class Person:
    def __init__(self, age, create_date):
        self._age = age

    # Getter 方法
    @property
    def age(self):
        return self._age

    # Setter 方法
    @age.setter
    def age(self, value):
        if not isinstance(value, int):
            raise TypeError('期望是一个 int')
        self._age = age

    # Deleter 方法
    @age.deleter
    def age(self):
        raise AttributeError("这个属性不能删除")


if __name__ == '__main__':
    person = Person(29)
    # 这里可以使用访问属性的方式来使用方法 `age`
    print(person.age)

上述中我们 方法 age 使用了@property,它可以像普通属性一样获取,或者赋值。

上述代码中有三个相关联的方法,这三个方法的名字都必须一样。 第一个方法是一个 getter 函数,它使得 age 成为一个属性。 其他两个方法给 age 属性添加了 setter 和 deleter 函数。

也可以只封装 getter 函数 ,需要强调的是只有在 age 属性被创建后, 后面的两个装饰器 @age.setter 和 @age.deleter 才能被定义。

二、什么时候使用 @property装饰器

1. 属性发生变化


假如你定义类Person是这样的

class Person:
    def __init__(self, age, create_date):
        self.age = age
        self.create_date = create_date
    
if __name__ == '__main__':
    person = Person(29, date(1990,9,9))
    # 这里直接访问对象属性
    print(person.age) 

一段时间后,你突然想起来,不应该直接获取Personage属性,因为年龄是随着时间变化而变化的,我们应该提供一个get_age()方法,可是代码中有很多地方已经在使用person.age,这个时候我们可以使用@property装饰器封装age,而别处使用person.age的地方就会转用新封装的方法。

2.为了语法简洁


python 提倡简洁的语法,它认为名词就应该可以像属性一样直接访问,而动词才封装成方法。
例如你封装了一个网络对象client,它具有 url
如果像下面两种写法,有人就是认为第二种更舒服。特别在函数的链式调用中。

parse(client.get_url())

parse(client.url)

参考文档

相关文章

  • python 元类编程(1) Property

    有时候,我们希望对对象的属性有更强的控制:比如希望某个值在一定的范围内(比如温度,年龄等),或者希望赋值的时候要是...

  • python元类编程(1)

    1. property动态属性 @property装饰器可以把一个类函数变成一个属性描述符, 能够像访问类的属性一...

  • python元编程详解

    注:采转归档,自己学习查询使用 python元编程详解(1)python元编程详解(2)python元编程详解(3...

  • python元类编程

    1.__new__和__init__区别

  • Python类元编程

    1. 什么是类元编程 类元编程是指动态地创建或定制类,也就是在运行时根据不同的条件生成符合要求的类,一般来说,类元...

  • 2015.4.15

    晴 学习内容 1.python 廖雪峰python教程面对对象高级编程部分,剩下定制类和元类还没看 2.计算机组成...

  • python元编程详解

    一、元编程的概念 元编程依赖于python的一个叫做元类的概念。元类就是当你的某段代码在被执行的过程中,另外一段代...

  • Python进阶7

    元类编程 Python属性函数 引言 Python中我们对于自己设置的类,尽量要使其属性私有化,获得更好的封装性。...

  • python元类编程(3)

    1. new方法和init方法的区别 new放法用来控制对象的生成过程,是在对象生成之前调用。该方法的第一个参数是...

  • python元类编程(4)

    1.如何在python中动态地创建类 方法一 :通过传入的参数进行判断生成类代码实例 运行结果 但该方法麻烦不灵活...

网友评论

      本文标题:python 元类编程(1) Property

      本文链接:https://www.haomeiwen.com/subject/urdrdctx.html