装饰器相关知识传送门——https://blog.youkuaiyun.com/weixin_43533825/article/details/87823860
一、@property装饰器
@property的作用是将类里的方法变成属性,同时可以对属性进行校验检查,简化代码,减少出错的概率
正常类和实例化,属性调用示例代码:
class user(object):
def get_username(self):
return self._username
def set_username(self,value):
self._username=value
if __name__=='__main__':
a=user()
a.set_username("sdf")
print a.get_username()
sdf
采用@property装饰器后的示例代码:加上@property把get方法变成属性,@property本身创建的username.setter装饰器把set方法变成属性赋值;这里如果只定义get方法,那属性只有只读属性;在属性赋值中可以对属性进行校验检查,这样使用@property可以让程序员写出简短的代码,同时保证对参数进行必要检查,减少出错
#coding:utf-8
class user(object):
@property
def username(self):
return self._username
@username.setter
def username(self,value):
if value=="":
raise ValueError(u"名字不能为空")
self._username=value
if __name__=='__main__':
a=user()
a.username="sdf"
print a.username
a.username=''
print a.username
上述代码如果直接直接用a.username会报错,因为该类没有进行__inti__初始化,没有username这个值
二、@staticmethod装饰器
定义:将被装饰的方法从类中分离独立出来,被装饰的方法不能访问类和实例的属性,不允许使用self;这样的方法其实是类的工具包,与类和实例都没有绑定关系,但类和实例都可以调用该方法
应用场景:
- 限制作用域:区别于普通函数,这个函数只能被该类调用;
- 代码易读性:不允许使用self参数
- 节省内存:被装饰的方法与类和实例都没有绑定关系,所以即使没有实例化也可以通过类调用该方法
三、@classmethod装饰器
@classmethod只能访问类的变量,不能访问实例的变量,通过cls(只是习惯写cls,跟self一样,约定俗成)参数传递类对象,绑定类对象,类和实例对象都可以调用被装饰的方法
常用方法,@staticmethod以及@classmethod的定义,调用方式以及绑定对象示例代码如下:
#coding:utf-8
class demo(object):
name="test"
def __init__(self,name):
self.name=name
def func(self,value):
print "func running: "+value
@staticmethod
def static_func(value):
print "static_func running: "+value
@classmethod
def class_func(cls,value):
print "classmethod: "+cls.name+" "+value
if __name__=='__main__':
#类初始化
a=demo("demotest")
#实例调用方法
a.static_func("statcimethod")
a.class_func("classmethod")
a.func("normalmethod")
#类调用方法
demo.static_func("staticmethod")
demo.class_func("classmethod")
#绑定对象
print a.func
print a.static_func
print a.class_func
print demo.static_func
print demo.class_func
static_func running: statcimethod
classmethod: test classmethod
func running: normalmethod
static_func running: staticmethod
classmethod: test classmethod
<bound method demo.func of <__main__.demo object at 0x06BC9130>>
<function static_func at 0x06BC6B70>
<bound method type.class_func of <class '__main__.demo'>>
<function static_func at 0x06BC6B70>
<bound method type.class_func of <class '__main__.demo'>>