网站首页 > java教程 正文
大家好,我是大爆炸
在介绍@property前先介绍property()。
property()构造函数返回property属性。其语法是:
property(fget=None, fset=None, fdel=None, doc=None)
property()参数:
- fget (optional) - 用于获取属性值,默认为None。
- fset (optional) - 用于设置属性值,默认为None。
- fdel (optional) - 用于删除属性值。默认为None。
- doc (optional) - 包含该属性的文档(docstring)的字符串。默认为None。
property()返回值:
property()从给定的getter、setter和deleter返回property属性。
- 如果没有给出参数,property()返回一个不包含任何getter、setter或deleter的基属性属性。
- 如果没有提供doc,property()接受getter函数的文档字符串。
示例1:使用getter、setter和deleter创建属性
class Person:
def __init__(self, name):
self._name = name
def get_name(self):
print('Getting name')
return self._name
def set_name(self, value):
print('Setting name to ' + value)
self._name = value
def del_name(self):
print('Deleting name')
del self._name
# Set property to use get_name, set_name
# and del_name methods
name = property(get_name, set_name, del_name, 'Name property')
p = Person('Adam')
print(p.name)
p.name = 'John'
del p.name
结果:
Getting name
The name is: Adam
Setting name to John
Deleting name
这里,_name被用作私有变量,用于存储Person的名称。
我们还设置:
- getter方法get_name()来获取人员的姓名,
- setter方法set_name()来设置人员的姓名,
- deleter方法del_name()来删除人员的姓名。
通过调用property()方法来设置一个新的属性name。
如程序所示,内部引用p.name调用get_name()作为getter, set_name()作为setter, del_name()作为deleter,通过方法内部的打印输出。
示例2:使用@property装饰器
可以使用Python装饰器@property来分配getter、setter和deleter,而不是使用property()。
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
print('Getting name')
return self._name
@name.setter
def name(self, value):
print('Setting name to ' + value)
self._name = value
@name.deleter
def name(self):
print('Deleting name')
del self._name
p = Person('Adam')
print('The name is:', p.name)
p.name = 'John'
del p.name
输出:
Getting name
The name is: Adam
Setting name to John
Deleting name
这里使用了@property装饰器,而不是property()。
- 首先,指定name()方法也是Person的一个属性。这是通过在getter方法之前使用@property来实现的。
- 接下来,使用属性名来指定setter和deleter。这是通过使用@name完成的。@name.setter用于setter方法,@name.deleter用于deleter方法。
在定义getter、setter和deleter时,使用了相同的方法name()。现在,无论何时使用 p.name,它都会在内部调用相应的getter、setter和deleter。
猜你喜欢
- 2025-10-02 Delphi变量的作用域详解_delphi函数调用
- 2025-10-02 熬夜7天,我总结了JavaScript与ES的25个知识点
- 2025-10-02 VB编程(八)常量和变量_vb中常量
- 2025-10-02 JS前端闭包是什么?私有变量可以用到闭包
- 2025-10-02 JavaScript初学者指南_javascript学习指南
- 2025-10-02 大语言模型学习Python 中的描述符(Descriptor)
- 2025-10-02 scala基础学习(三)_scala语言基础
- 2025-10-02 你的 SpringBoot 项目藏着多少内存 “黑洞”?3 招根治泄漏难题
- 2025-10-02 linux中内部变量,环境变量,用户变量的区别
- 2025-10-02 零基础零成本,手把手部署一个属于你的私有大模型。
你 发表评论:
欢迎- 最近发表
-
- JUC系列之《CompletableFuture:Java异步编程的终极武器》
- SpringBoot+Jasync异步化改造狂降90%耗时,百万并发下的性能杀戮
- Java异步编程神器:CompletableFuture实战技巧
- Spring Boot 异步请求 + 虚拟线程性能提升?结果很意外
- 异步可以单线程,但高并发的异步肯定要用线程池
- Java线程实现原理及相关机制_java线程的实现
- java线程终止 interrupt 关键字详解
- Java处理百万级消息积压方案_java 实时处理亿级数据
- 阻塞模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
- 安卓7系统设置永不休眠_android 设置永不休眠
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)