python的@property

python的@property

   小樱     2021年2月27日 09:19     1014    

转载自:https://blog.csdn.net/u013821237/article/details/84673712


首先看下属性的分类:

1:实例属性:

  最好在__init__(self,...)中初始化

  内部调用时都需要加上self.

  外部调用时用instancename.propertyname

2:类属性:

  在__init__()外初始化

  在内部用classname.类属性名调用

  外部既可以用classname.类属性名又可以用instancename.类属性名来调用

3:私有属性:

  1):单下划线_开头:只是告诉别人这是私有属性,外部依然可以访问更改

  2):双下划线__开头:外部不可通过instancename.propertyname来访问或者更改

      实际将其转化为了_classname__propertyname

正常情况下,我们对属性赋值,直接赋值就可以了:

 

class People(object):

    def __init__(self, name, age):

        self.name = name

        self.age = age

 

p1 = People('张三', 22)

p1.name='李四'

print(p1.name)

 

++++++++++++++++++++++result++++++++++++++++++++++++

李四

 

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

p1 = People('张三', 22)

p1.set('李四')

print(p1.getName());

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

@property

def name(self):

    a = self._name

    #返回前还可以对数据做处理,比如格式化等

    return a

 

@name.setter

def name(self,value):

#在赋值之前添加判断

if not isinstance(value,str):

    # 抛出异常

    raise TypeError('People object.name,name must be a str!')

self._name = value

 

#调用的时候仍然是方便快捷的直接赋值:

p1 = People('张三', 22)

p1.name='李四'

print(p1.name)

 

++++++++++++++++++++++result++++++++++++++++++++++++

李四

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


文章评论

0

其他文章