什么是python类属性

(编辑:jimmy 日期: 2024/11/14 浏览:2)

首先我们来看一下属性的定义

属性的定义: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:

#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装饰器对属性的取值和赋值加以控制

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!

实例扩展:

class Dog(object): 
 
 name = 'dog' 
 
 def init(self): 
 
  self.age = 18
 
d1 = Dog()

d2 = Dog()

这里有两个实例 d1,d2 吧。

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 的含义就不同了,它们的值也不同,很明显它们的数据没有共享。

一句话新闻

高通与谷歌联手!首款骁龙PC优化Chrome浏览器发布
高通和谷歌日前宣布,推出首次面向搭载骁龙的Windows PC的优化版Chrome浏览器。
在对骁龙X Elite参考设计的初步测试中,全新的Chrome浏览器在Speedometer 2.1基准测试中实现了显著的性能提升。
预计在2024年年中之前,搭载骁龙X Elite计算平台的PC将面世。该浏览器的提前问世,有助于骁龙PC问世就获得满血表现。
谷歌高级副总裁Hiroshi Lockheimer表示,此次与高通的合作将有助于确保Chrome用户在当前ARM兼容的PC上获得最佳的浏览体验。