python特性property
通常,访问类和实例属性的时候,将返回所存储的相关值,也就是直接和类(实例的)的__dict__打交道。若果要规范这些访问和设值方式的话,
一种方法是数据描述符,另一种就是python内置的数据描述符协议函数Property()。property是一种特殊的值,访问它时会计算它的值。
特性的原型函数是property(getf=None,setf=None,delf=None,doc=None),函数的前三个参数分别对应描述符的__get__、__set__、__delete__方法。
1 2 3 4 5 6 7 8 9 10 | class Foo( object ): def __init__( self ,name): self ._name = name def getname( self ): return self ._name def setname( self ,value): self ._name = value def delname( self ): del self ._name name = property (getname,setname,delname) |
这样就可以对属性进行读取、设置和删除了:
1 2 3 4 5 6 7 8 9 | >>> f = Foo( 'hello' ) >>> f.name 'hello' >>> f.name = 'world' >>> f.name 'world' >>> del f.name >>> f.name AttributeError: 'Foo' object has no attribute '_name' |
python2.6新增加了一个property装饰器,写起来更加的优雅。
1 2 3 4 5 6 7 8 9 10 11 12 | class Foo( object ): def __init__( self ,name): self ._name = name @property def name( self ): return self ._name @name .setter def name( self ,value): self ._name = value @name .deleter def name( self ): del self ._name |
首先使用@property装饰器和相关方法将属性name设置为可读,后面的@name.setter和@name.deleter装饰器将其他方法与name属性上的设置和
删除操作相关联。实际的name值存储在属性_name中。实际存储属性的名称无需遵循任何约定,只需要与特性名称不同即可。
特性的使用遵循统一访问原则。如果没有特性,将会以简单属性的形式访问属性,而其他属性将以方法的形式访问。费力去了解何时添加额外的()会带来不必要的混淆。
实际上,方法本身是作为一类特性被隐式处理的。
1 2 3 4 5 | class Foo( object ): def __init__( self ,name): self .name = name def spam( self ,x): print '%s.%s' % ( self .name,x) |
用户创建f=Foo('hello')这样的实例然后访问f.spam时,不会返回原始函数对象spam,相反会得到绑定方法。绑定方法有点类似于部分计算的函数,
其中的self参数已经填入,但其他参数仍然需要在使用()调用该函数时提供。这种绑定方法是由在后台执行的特性函数静静地创建的。使用@staticmethod和
@classmethod定义静态方法和类方法时,实际上就指定了使用不同的特性函数,以不同的方式处理对这些方法的访问。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探