码迷,mamicode.com
首页 > 其他好文 > 详细

[转]实例属性、类属性、@property的用法

时间:2020-05-30 19:38:47      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:处理   code   err   不可   需要   getname   details   添加   style   

1:实例属性:
最好在__init__(self,...)中初始化
内部调用时都需要加上self.
外部调用时用instancename.propertyname
2:类属性:
在__init__()外初始化
在内部用classname.类属性名调用
外部既可以用classname.类属性名又可以用instancename.类属性名来调用
3:私有属性:
1):单下划线_开头:只是告诉别人这是私有属性,外部依然可以访问更改
2):双下划线__开头:外部不可通过instancename.propertyname来访问或者更改
实际将其转化为了_classname__propertyname
 
正常情况下,我们对属性赋值,直接赋值就可以了:
 1 class People(object):
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5 p1 = People(张三, 22)
 6 p1.name=李四
 7 print(p1.name) 
 8 
 9 ++++++++++++++++++++++result++++++++++++++++++++++++
10 李四

但是如果我们对所赋的值有一定的限制,比如要求名字必须是字符串,年龄必须是数字,否则会对方法的调用造成影响,这个时候单纯的赋值就不能满足这样的过滤效果了。既然是条件过滤,那么这几条代码就需要放在方法里,所以就有了setName(),getName()这样的方法,在set方法里做条件限制,使用的时候是这样的:

1 p1 = People(张三, 22)
2 
3 p1.set(李四)
4 
5 print(p1.getName())

这样其实已经可以了,很满足功能需要。而用@property是让这个更简洁,既保持直接对属性赋值的方便,又对条件做了限制

 1     @property
 2     def name(self):
 3         a = self._name
 4         #返回前还可以对数据做处理,比如格式化等
 5         return a
 6     @name.setter
 7     def name(self,value):
 8         #在赋值之前添加判断
 9         if not isinstance(value,str):
10             # 抛出异常
11             raise TypeError(People object.name,name must be a str!)
12         self._name = value
13 #调用的时候仍然是方便快捷的直接赋值:
14 p1 = People(张三, 22)
15 p1.name=李四
16 print(p1.name)
17 ++++++++++++++++++++++result++++++++++++++++++++++++
18 李四

总之,@property就是既拥有set、get方法的灵活性,又具有属性直接赋值取值的简便性。

————————————————
版权声明:本文为CSDN博主「大大大大大碗面」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013821237/java/article/details/84673712

[转]实例属性、类属性、@property的用法

标签:处理   code   err   不可   需要   getname   details   添加   style   

原文地址:https://www.cnblogs.com/zxqqlove/p/12994311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!