您的位置:首页 > 编程语言 > Python开发

python 属性 property、getattr()、setattr()详解

2018-05-21 19:53 706 查看

直奔主题

使用中文注释需要使用

 

#-*-coding:utf-8-*-

 

 

property

property在python中有2中使用property方法:
1.@property @属性名称.setter @属性名称.deleter
2.使用property(fget, fset, fdel, doc)指定

1.使用装饰器@property
要求:(1)所用的类为新式类,在python3版本以上默认为新式类,或者是是直接或间接继承object的类
(2)定义的函数名称必须要是名称名(如属性名是name,那函数名称就为name,不能为其他的。详情看例子)

class Demo(object):
def __init__(self):
print("这是构造函数")
self._name = None

@property
def name(self):
return self._name #这是属性get的方法

@name.setter
def name(self, value):#这是属性set的方法
self._name = value

@name.deleter
def name(self):
print("this is the method of delete")
self._name = None

if __name__ == "__main__":
testDemo = Demo()
print(testDemo.name)
testDemo.name = "name"
print(testDemo.name)
del testDemo.name

以下是结果:

#======以下是结果========
这是构造函数
None
name
this is the method of delete

2.使用property()方法 property(fget,fset,fdel,doc)
要求:(1)所用的类为新式类,在python3版本以上默认为新式类,或者是是直接或间接继承object的类

 

class Demo2(object):
def __init__(self):
print("这是构造函数")
self._value = None

def getValue(self):#这是属性value的get方法
print("getting the value of property")
return self._value

def setValue(self, value):#这是属性value的set方法
print("setting the value of property")
self._value = value

def delValue(self):#这是属性value删除方法
print("this is the method of delete")
self._value = None

value = property(fget=getValue, fset=setValue, fdel=delValue, doc="this is a message about the property of value")

if __name__ == "__main__":
testDemo = Demo2()
print(testDemo.value)
testDemo.value = "name"
print("print the value of property:",testDemo.value)
del testDemo.value

以下是结果:

#======以下是结果========
这是构造函数
getting the value of property
None
setting the value of property
getting the value of property
('print the value of property:', 'name')
this is the method of delete

 使用属性property2种方法存放多个值的例子

1.使用装饰器@property进行设置 属性含有多个值

class Demo4(object):
def __init__(self):
print("这是构造函数")
self._value1 = None
self._value2 = None

@property
def values(self):
return self._value1, self._value2 #这是属性get的方法

@values.setter
def values(self, values):#这是属性set的方法
self._value1, self._value2 = values

@values.deleter
def values(self):
print("this is the method of delete")
self._value1 = None
self._value2 = None

if __name__ == "__main__":
testDemo = Demo4()
print(testDemo.values)
testDemo.values = "name","helloworld"
print("print the value of property:", testDemo.values)
del testDemo.values

以下是结果:

#======以下是结果========
这是构造函数
(None, None)
('print the value of property:', ('name', 'helloworld'))
this is the method of delete

 

2.property(fget, fset, fdel, doc)方法设置  属性含有多个值

class Demo3(object):
def __init__(self):
print("这是构造函数")
self._value = None
self._value2 = None

def getoValue(self):  # 这是属性value的get方法
print("getting the value of property")
return self._value, self._value2

def setoValue(self, values):  # 这是属性value的set方法
print("setting the value of property")
self._value, self._value2 = values

def deloValue(self):  # 这是属性value删除方法
print("this is the method of delete")
self._value = None

values = property(fget=getoValue, fset=setoValue, fdel=deloValue, doc="this is a message about the property of values")

if __name__ == "__main__":
testDemo = Demo3()
print(testDemo.values)
testDemo.values = "name","helloworld"
print("print the value of property:", testDemo.values)
del testDemo.values

以下是结果:

这是构造函数
getting the value of property
(None, None)
setting the value of property
getting the value of property
('print the value of property:', ('name', 'helloworld'))
this is the method of delete

 

 

 

 

getter和setter

getter和setter 是在对象上动态的增加属性

if __name__ == "__main__":
testDemo = Demo2()

print([n for n in dir(testDemo) if n[0] is not "_"])
setattr(testDemo, "newMethod", "hellworld")
print([n for n in dir(testDemo) if n[0] is not "_"])
value = getattr(testDemo, "newMethod")
print(value)
#使用getattr获取一个不存在的属性,如果属性不存在,则返回一个默认的值
value = getattr(testDemo, "yoyo", "the value is not exist!")
print(value)

以下是结果:

#======以下是结果========
这是构造函数
['delValue', 'getValue', 'setValue', 'value']
['delValue', 'getValue', 'newMethod', 'setValue', 'value']
hellworld
the value is not exist!

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: