IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【Python面向对象编程】第18篇 属性装饰器 -> 正文阅读

[Python知识库]【Python面向对象编程】第18篇 属性装饰器

本篇我们学习 Python 属性装饰器(@property)的原理。

属性装饰器

上一篇中,我们介绍了如何利用 property 类定义类的属性。property 类的调用语法如下:

property(fget=None, fset=None, fdel=None, doc=None)

以下代码定义了一个 Person 类包含两个属性 name 和 age:

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

使用 property 类定义 age 属性的 getter 方法:

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

    def get_age(self):
        return self._age

    age = property(fget=get_age)

property() 方法接受一个 getter 方法作为参数,返回一个 property 对象。

以下示例创建了一个 Person 类实例,通过实例获取 age 属性的值:

john = Person('John', 25)
print(john.age)

输出结果如下:

25

另外,我们也可以直接调用 Person 对象的 get_age() 方法:

print(john.get_age())

也就是说,我们既可以利用 age 属性获取年龄,也可以通过 get_age() 方法获取年龄。这两种方式是不必要的重复,为了减少重复,我们可以将 get_age() 方法重命名为 age():

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

    def age(self):
        return self._age

    age = property(fget=age)

property() 方法接受一个可调用对象(age),同时返回一个可调用对象。因此它是一个装饰器。我们可以使用 @property 装饰器装饰 age() 方法:

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

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

通过使用 @property 装饰器,我们可以简化类的属性定义。

Setter 装饰器

以下代码为 Person 类增加了一个 setter 方法(set_age),用于为 _age 属性赋值:

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

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

    def set_age(self, value):
        if value <= 0:
            raise ValueError('The age must be positive')
        self._age = value

为了将 set_age 赋予 age 属性对象的 fset 参数,可以调用 age 属性对象的 setter() 方法:

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

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

    def set_age(self, value):
        if value <= 0:
            raise ValueError('The age must be positive')
        self._age = value

    age = age.setter(set_age)

setter() 方法接受一个可调用对象参数,同时返回另一个可调用对象(属性对象)。所以,我们可以使用 @age.setter 属性装饰器装饰 set_age() 方法:

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

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

    @age.setter
    def set_age(self, value):
        if value <= 0:
            raise ValueError('The age must be positive')
        self._age = value

现在我们可以将 set_age() 方法重命名为 age() 方法,并且在 __init__() 方法中使用 age 属性:

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

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

    @age.setter
    def age(self, value):
        if value <= 0:
            raise ValueError('The age must be positive')
        self._age = value

总结来说,我们可以使用装饰器创建属性:

class MyClass:
    def __init__(self, attr):
        self.prop = attr

    @property
    def prop(self):
        return self._attr

    @prop.setter
    def prop(self, value):
        self._attr = value

在以上方式中,__attr 是私有属性,prop 是属性名。

以下示例使用 @property 装饰器为 Person 类创建了两个属性 name 和 age:

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

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

    @age.setter
    def age(self, value):
        if value <= 0:
            raise ValueError('The age must be positive')
        self._age = value

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

    @name.setter
    def name(self, value):
        if value.strip() == '':
            raise ValueError('The name cannot be empty')
        self._age = value

总结

  • 属性装饰器(@property)可以创建类的属性。
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:36:49  更:2022-04-18 17:42:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:36:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码