Python @property介绍
- 对于封装来说:通过实例.实例属性来访问实例的实例属性是不建议这么操作的
- 正常情况下,实例的属性应该是隐藏的,只能通过类下的实例方法来间接访问
class Students:
def __init__(self, name, age):
self.__name = name
self.__age = age
def get_name(self):
return self.__name
def set_name(self,new_name):
self.__name = new_name
s1 = Students('周杰伦',42)
print(s1.get_name())
s1.set_name('刘若英')
print(s1.get_name())
-
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性
-
property 作用是把实例方法,变成属性一样调用,即原本是实例.方法()变成实例.属性一样使用;另外还可以对实例属性进行限制,如属性只可读(有可读,可写,可删除)
-
首先需要实例化property
class Students:
def __init__(self,name):
self.__name = name
def get_name(self):
return self.__name
def set_name(self,new_name):
self.__name = new_name
name = property(fget=get_name,fset=set_name,doc='测试property')
print(Students.name.__doc__)
s1 = Students('周杰伦')
print(s1.name)
-
基本格式:属性名 = property(fget=None, fset=None, fdel=None, doc=None)
fget:用于获取属性的方法
fset:用于设置属性的方法
fdel:用于删除属性的方法
doc:属性的说明文档字符串 -
初始化参数不是必填,不填就默认为None,填了就代表属性具体哪些权限
-
还有一种更简单的方法实现上面的功能,就是直接使用装饰器,如@property(代表只读), @方法名.setter(代表可写),@方法名.deleter(代表可删除)
-
此时方法名字就需要一致(因为代表的是一个属性,一个属性不可能有多个名字),另外这个名字不能和类里的其他属性名称一样,否则会报错
class Students:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self, new_name):
self.__name = new_name
s1 = Students('周杰伦')
print(s1.name)
s1.name = 'JAY'
print(s1.name)
- 可以看出实例s1,原本(name的实例方法变成了属性一样的调用方式)
本文来自博客园,作者:弩哥++,转载请注明原文链接:https://www.cnblogs.com/bangbangzoutianya/p/15407956.html