Python3 property属性

简介:

python3中的property有一个很有意思的功能,它能将类中的方法像类属性一样调用!

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

我们先来简单了解一下这个property类,下面看一下官网给出的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class  C:
     def  __init__( self ):
         self ._x  =  None
 
     def  getx( self ):
         return  self ._x
 
     def  setx( self , value):
         self ._x  =  value
 
     def  delx( self ):
         del  self ._x
 
     =  property (getx, setx, delx,  "I'm the 'x' property." )   # 这里的x相当于类属性
     
=  C()   # 生成一个对象
c.x  =  10   # 设置self._x=10,实际调用的就是类中setx方法
c.x   # 获取self._x的值,实际调用的就是类中getx方法
del  c.x   # 删除self._x的值,实际调用的就是类中delx方法

    是不是感觉很有意思,很不可思议!property中fget是一个函数,它获取属性值;fset是一个函数,它设置一个属性值;fdel是一个函数,它删除一个属性值;doc为该属性创建一个docstring。你只要在使用时在对应的形参位置放上你写的对应函数,就可以轻松使用了。


我们还可以将property作为装饰器来使用,还是使用官网的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class  C:
     def  __init__( self ):
         self ._x  =  None
 
     @ property
     def  x( self ):
         """I'm the 'x' property."""
         return  self ._x
 
     @x.setter
     def  x( self , value):
         self ._x  =  value
 
     @x.deleter
     def  x( self ):
         del  self ._x

    property对象有getter、setter、deleter三个方法,getter获取属性值,setter设置属性值,deleter设置属性值,这个例子的效果跟上一个例子的效果完全相同!我们看到里面的方法名是一模一样的,但是达到的效果却是不同的。第一个x方法是获取属性值,第二个x方法是设置属性值,第三个x方法是删除属性值。

    你看到这里是不是以为这一切都是property帮你做到的,错,错,错!其实property只做了一件事件,它将你的方法能像类属性一样使用,至于里面的查、删、改,其实都是你自己写的函数实现的!fget、fset、fdel、setter、deleter这些仅仅只是名字而且,方便你识别,其他什么作用都没有!

我们来看一下property的源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
class  property ( object ):
     """
     property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
     
     fget is a function to be used for getting an attribute value, and likewise
     fset is a function for setting, and fdel a function for del'ing, an
     attribute.  Typical use is to define a managed attribute x:
     
     class C(object):
         def getx(self): return self._x
         def setx(self, value): self._x = value
         def delx(self): del self._x
         x = property(getx, setx, delx, "I'm the 'x' property.")
     
     Decorators make defining new properties or modifying existing ones easy:
     
     class C(object):
         @property
         def x(self):
             "I am the 'x' property."
             return self._x
         @x.setter
         def x(self, value):
             self._x = value
         @x.deleter
         def x(self):
             del self._x
     """
     def  deleter( self * args,  * * kwargs):  # real signature unknown
         """ Descriptor to change the deleter on a property. """
         pass
 
     def  getter( self * args,  * * kwargs):  # real signature unknown
         """ Descriptor to change the getter on a property. """
         pass
 
     def  setter( self * args,  * * kwargs):  # real signature unknown
         """ Descriptor to change the setter on a property. """
         pass
 
     def  __delete__( self * args,  * * kwargs):  # real signature unknown
         """ Delete an attribute of instance. """
         pass
 
     def  __getattribute__( self * args,  * * kwargs):  # real signature unknown
         """ Return getattr(self, name). """
         pass
 
     def  __get__( self * args,  * * kwargs):  # real signature unknown
         """ Return an attribute of instance, which is of type owner. """
         pass
 
     def  __init__( self , fget = None , fset = None , fdel = None , doc = None ):  # known special case of property.__init__
         """
         property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
         
         fget is a function to be used for getting an attribute value, and likewise
         fset is a function for setting, and fdel a function for del'ing, an
         attribute.  Typical use is to define a managed attribute x:
         
         class C(object):
             def getx(self): return self._x
             def setx(self, value): self._x = value
             def delx(self): del self._x
             x = property(getx, setx, delx, "I'm the 'x' property.")
         
         Decorators make defining new properties or modifying existing ones easy:
         
         class C(object):
             @property
             def x(self):
                 "I am the 'x' property."
                 return self._x
             @x.setter
             def x(self, value):
                 self._x = value
             @x.deleter
             def x(self):
                 del self._x
         
         # (copied from class doc)
         """
         pass
 
     @ staticmethod  # known case of __new__
     def  __new__( * args,  * * kwargs):  # real signature unknown
         """ Create and return a new object.  See help(type) for accurate signature. """
         pass
 
     def  __set__( self * args,  * * kwargs):  # real signature unknown
         """ Set an attribute of instance to value. """
         pass
 
     fdel  =  property ( lambda  self object (),  lambda  self , v:  None lambda  self None )   # default
 
     fget  =  property ( lambda  self object (),  lambda  self , v:  None lambda  self None )   # default
 
     fset  =  property ( lambda  self object (),  lambda  self , v:  None lambda  self None )   # default
 
     __isabstractmethod__  =  property ( lambda  self object (),  lambda  self , v:  None lambda  self None )   # default

    看到上面的源代码恍然大悟没,fdel、fget、fset都只是执行你函数里面的代码而已!所以我们就记住一句话就够了:“property能让你的方法像类属性一样使用”。

本文转自戴柏阳的博客博客51CTO博客,原文链接http://blog.51cto.com/daibaiyang119/1972460如需转载请自行联系原作者


daibaiyang119

相关文章
|
3月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
316 0
|
5月前
|
Python
解决Python中AttributeError:'image'对象缺少属性'read_file'的问题策略。
通过上述策略综合考虑,您将能够定位问题并确定如何解决它。记住,Python社区很庞大,也很乐于帮助解决问题,因此不要害怕在求助时提供尽可能多的上下文和您已经尝试过的解决方案。
162 0
|
9月前
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
440 15
|
12月前
|
物联网 Python
请问:如何使用python对物联网平台上设备的属性进行更改?
为验证项目可行性,本实验利用阿里云物联网平台创建设备并定义电流、电压两个整型属性。通过Python与平台交互,实现对设备属性的控制,确保后续项目的顺利进行。此过程涵盖设备连接、数据传输及属性调控等功能。
|
11月前
|
C语言 Python
Python学习:内建属性、内建函数的教程
本文介绍了Python中的内建属性和内建函数。内建属性包括`__init__`、`__new__`、`__class__`等,通过`dir()`函数可以查看类的所有内建属性。内建函数如`range`、`map`、`filter`、`reduce`和`sorted`等,分别用于生成序列、映射操作、过滤操作、累积计算和排序。其中,`reduce`在Python 3中需从`functools`模块导入。示例代码展示了这些特性和函数的具体用法及注意事项。
225 2
|
缓存 Java Python
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用(1)
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用(1)
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
275 2
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
160 1
|
程序员 开发者 Python
Python动态属性与反射机制方式
通过反射和动态属性,Python程序员获得了巨大的权能,能在运行时访问、修改或为对象新增属性和方法,显著提高编程的智能化和适应性。内置的反射机制可能使开发者跨越编写代码时的限制,通过名称访问对象的特性、方法以及其他成员,为创建一个具有高度配置性、扩展性强大的应用程序打下基础。此外,利用getattr和setattr函数来获取和设定对象的属性,或是利用hasattr确认其是否存在某属性,甚至可以通过名字来动态地执行对象的函数。 总之,反射和动态属性对于Python的程序开发而言是重要的工具,它们不仅提供了编写效率高且灵活的代码的能力,还为构建可高度定制和扩展的应用程序提供了可能。对于熟练掌握这些
|
存储 API 索引
让 Python 的属性查找具有 C 一级的性能
让 Python 的属性查找具有 C 一级的性能
99 0

推荐镜像

更多