博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)
阅读量:4703 次
发布时间:2019-06-10

本文共 2364 字,大约阅读时间需要 7 分钟。

本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出。

property装饰器

功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能。

  能够通过实例直接点出属性值来,更加方便快捷,如例三中student.age:

例一:

错误效果:

class Student(object):    age = 20student = Student()print(student.age)  #打印结果为20student.age="二十"  #不应该绑定为字符串的属性

 为了避免如上行为,将代码更改为:

例二:

class Student(object):    def __init__(self):        self._age = None    def age_getter(self):   #返回属性值        return self._age    def age_setter(self, age):  #设置属性值        if isinstance(age, str) and age.isdigit():   #验证绑定属性的类型            age = int(age)           if isinstance(age, int):            self._age = age        else:            raise ValueError("age is illegal")  #如果不能转换类型则抛出错误student=Student()student.age_setter("5")  #绑定属性为字符串5print(student.age_getter())   打印结果为5,Int格式

 上述代码解决了属性绑定类型错误的问题,但是不够方便,Python自带的property装饰器能够帮助修饰代码,如下:

例三:

class Student(object):    def __init__(self):        self._age = None    @property  #装饰age函数,可以直接将age函数作为属性,直接通过等号绑定属性值    def age(self):        return self._age    @age.setter #通过setter设置age的属性,函数内部写验证规则    def age(self,age):        if isinstance(age,int):            self._age =age            return        if isinstance(age,str) and age.isdigit():            age = int(age)            self._age = age        else:            raise ValueError("age is illegal")    @age.deleter  #deleter是删除属性方法    def age(self):        del self._agestudent =Student()student.age = "20"print(student.age)# del student.age# print(student.age)

 staticmethod装饰器

功能:将被装饰的函数从类中分离出来,该函数不能访问类的属性,简单说可以将该函数理解为一个独立的函数,不允许使用self。

 

 staticmethod 就是将该被装饰的函数与该类没有关系,该函数不能用self传参,需要和普通函数一样传参。

作用:

限制名称空间,这个函数虽然是个普通的函数,但只有这个类里能用到
代码易读性.静态方法并不需要self参数
约内存.不用每个实例都实例化方法.
在类内部控制静态方法.不然的话换一种实现方法,把函数放在在类外部

例四:

class Dog(object):    def __init__(self,name):        self.name = name    @staticmethod    def eat(name,food):        print("%s is eating %s" %(name,food))d = Dog("tom")d.eat("tom","包子")#通过对象调用方法Dog.eat("jerry","面条")#通过类调用方法

 

classmethod装饰器,类装饰器

例五:

 

class Dog(object):    name="Jerry"    def __init__(self,name):        self.name = name    @classmethod    def eat(self):        print("%s is eating %s" %(self.name,"food"))    def talk(self):        print("%s is talking" % self.name)d = Dog("Tom")d.eat()Dog.eat()

 工厂模式的一个方法

class method可以用来为一个类创建一些预处理的实例.
类方法只能找类变量,不能访问实例变量,
所以这里的name是jerry而不是实例化的tom

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/ArmoredTitan/p/8550892.html

你可能感兴趣的文章
最短路模板(SPFA POJ2387)
查看>>
windows用户态和内核态
查看>>
Oracle删除当前用户下所有的表的方法1
查看>>
UDP异步通信
查看>>
生成器 列表推导式 列表表达式
查看>>
Jenkins权限控制
查看>>
6-6 Haar特征3
查看>>
MyEclipse10安装Svn插件的几种方法
查看>>
day37-hibernate 02-Hibernate二级缓存:二级缓存的散装数据
查看>>
NOIP2014 飞扬的小鸟(Flappy Bird)
查看>>
P1988 最大数
查看>>
CDH CM版本 6.0.1 升级到 CM 6.2.0 当前最新版本(CentOS 7.x)
查看>>
洛谷 P1678 烦恼的高考志愿
查看>>
第五周编程总结
查看>>
了解计算机的发展历程
查看>>
VC++函数(win32_exe)
查看>>
306 Additive Number 加法数
查看>>
算法分析
查看>>
Linux 安装php扩展 swoole
查看>>
关于 AfxSocketInit()
查看>>