什么是python类属性

作者:silencement 时间:2021-07-31 20:27:16 

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

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

来源:https://www.py.cn/faq/python/11778.html

标签:python,类属性
0
投稿

猜你喜欢

  • golang 实现interface{}转其他类型操作

    2024-05-09 09:31:23
  • Django通过自定义认证后端实现多种登录方式验证

    2022-09-21 20:15:40
  • Pandas缺失值填充 df.fillna()的实现

    2023-11-24 00:01:41
  • SqlServer 索引自动优化工具

    2012-10-07 10:41:09
  • 八大排序算法的Python实现

    2023-08-02 16:09:31
  • Python+pyftpdlib实现局域网文件互传

    2022-01-10 04:09:30
  • 利用pyshp包给shapefile文件添加字段的实例

    2023-08-12 15:48:38
  • 基于javascript实现tab选项卡切换特效调试笔记

    2024-06-12 13:48:02
  • axios发送post请求,提交图片类型表单数据方法

    2024-04-26 17:40:27
  • ZABBIX3.2使用python脚本实现监控报表的方法

    2021-04-11 20:15:02
  • Vue 中文本内容超出规定行数后展开收起的处理的实现方法

    2024-05-29 22:48:07
  • 简单介绍Python中用于求最小值的min()方法

    2021-05-27 23:00:11
  • Python字符串、整数、和浮点型数相互转换实例

    2023-09-20 18:05:52
  • python实现生命游戏的示例代码(Game of Life)

    2023-11-02 21:33:35
  • Python 实现选择排序的算法步骤

    2023-04-01 18:28:53
  • Oracle故障处理Rman-06207&Rman-06214的方法

    2023-07-08 01:26:29
  • Pandas之Dropna滤除缺失数据的实现方法

    2022-03-30 03:29:42
  • 《设计网事》前言

    2009-07-15 17:19:00
  • javascript+HTML5 canvas绘制时钟功能示例

    2024-05-05 09:14:01
  • 基于Golang实现内存数据库的示例详解

    2024-01-20 05:23:18
  • asp之家 网络编程 m.aspxhome.com