python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...

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

property装饰器

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

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

例一:

错误效果:

class Student(object):

age = 20

student = Student()

print(student.age) #打印结果为20

student.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") #绑定属性为字符串5

print(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._age

student =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()

工厂模式的一个方法classmethod可以用来为一个类创建一些预处理的实例.

类方法只能找类变量,不能访问实例变量,

所以这里的name是jerry而不是实例化的tom

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值