首先我们来看一下属性的定义
属性的定义:python中的属性其实是普通方法的衍生。
操作类属性有三种方法:
1.使用@property装饰器操作类属性。
2.使用类或实例直接操作类属性(例如:obj.name,obj.age=18,del obj.age)
3.使用python内置函数操作属性。
属性存在的意义:
1、访问属性时可以制造出和访问字段完全相同的假象,属性由方法衍生而来,如果Python中没有属性,方法完全可以代替其功能。
2、定义属性可以动态获取某个属性值,属性值由属性对应的方式实现,应用更灵活。
3、可以制定自己的属性规则,用于防止他人随意修改属性值。
下面详细介绍三种操作类属性的方法:
1.使用@property装饰器操作类属性。
定义时,在普通方法的基础上添加@property装饰器;属性仅有一个self参数,调用时无需括号;
优点:
1) @property装饰器可以实现其他语言所拥有的getter,setter和deleter的功能(例如实现获取,设置,删除隐藏的属性)
2) 通过@property装饰器可以对属性的取值和赋值加以控制,提高代码的稳定性。
实例代码1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#encoding=utf-8
class Goods(): #新式类
@property
def price( self ): #查看属性值
print ( '@property ' )
@price .setter #修改、设置属性
def price( self , value):
print ( '@price.setter' )
@price .deleter #删除属性
def price( self ):
print ( '@price.deleter' )
obj = Goods( 50 )
obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
obj.price = 2000 # 自动执行 @price.setter 修饰的 price 方法,并将2000赋值给方法的参数
del obj.price # 自动执行 @price.deleter 修饰的 price 方法
结果输出:
@property
@price .setter
@price .deleter
|
实例代码2:通过@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
|
class Goods( object ):
def __init__( self ):
self .value = 50
@property
def price( self ): # 查看属性
return self .value
@price .setter # 添加或设置属性(属性名.setter)
def price( self , value):
if value > = 50 and value< = 100 : #对属性的取值和赋值加以控制
self .value = value
print ( self .value)
else :
print ( "请输入一个50到100之间的数!" )
@price .deleter # 删除属性(属性名.deleter) 注意:属性一旦删除,就无法设置和获取
def price( self ):
del self .value
print ( "price is deleted!" )
obj = Goods()
print (obj.price) # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
obj.price = 106 # 自动执行 @price.setter 修饰的 price 方法,并将106 赋值给方法
del obj.price # 自动执行 @price.deleter 修饰的 price 方法
结果输出:
50
请输入一个 50 到 100 之间的数!
price is deleted!
|
实例扩展:
1
2
3
4
5
6
7
8
9
10
11
|
class Dog( object ):
name = 'dog'
def init( self ):
self .age = 18
d1 = Dog()
d2 = Dog()
|
这里有两个实例 d1,d2 吧。
1
2
|
d1.name # 输出 dogd2.name # 输出 dogd1.name = 'abc'
d1.name # 输出 abcd2.name # 输出 dogDog.name # 输出 dog
|
原因是 d1.name 输出 dog 不是因为这个实例共享了类属性,而是因为这个实例没有 dog 属性,所以 python 查找了类属性。但是一旦你修改了 d1.name 相当于给 d1 实例绑定了 name 属性之后,d1.name 就与类属性无关了。既然这样就谈不上实例之间共享类属性了,因为只要一赋值,就相当于绑定了属性,则上述 d1.name 的含义和 d2.name 的含义就不同了,它们的值也不同,很明显它们的数据没有共享。
到此这篇关于什么是python类属性的文章就介绍到这了,更多相关python类属性是什么内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.py.cn/faq/python/11778.html