python设计模式之内置装饰器使用(四)
前言
python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下。
系列文章
python自带装饰器
staticmethod
staticmethod装饰器的功能是去除类的方法默认第一个参数是类的实例,使得该方法成为一个普通的函数,staticmethod是一个类,属于类装饰器。
class Person(object):
def eat(self):
print('eat thing')
@staticmethod
def go(): # 不再传递self
print('go')
classmethod
类定义时,除了new方法外,其他定义的方法在调用时第一个参数传入的必须是一个实例,使用classmethod装饰器装饰后,方法的第一个参数是类对象;调用类方法不需要创建类的实例。classmethod也是一个类,所以classmethod是一个类装饰器。
class Person(object):
_num_ear = 2
def eat(self):
print('eat thing')
@classmethod
def go(cls):
print(cls._num_ear)
print('go')
if __name__ == '__main__':
Person.go() # 无需创建实例,直接调用。
property
对于一个类的属性,python的访问是没有限制的,但有时候我们需要对属性的访问加以限制,property装饰器就是干这个的。
property是一个类,它有三个方法,deleter,setter,getter,有两种使用方式。
class Person(Animal):
_num_ear = 2
def __init__(self):
self._name = 'xiaoming'
self.age = 20
def get_name(self):
print('get name')
return self._name
def set_name(self, name):
print('set name')
self._name = name
def delete_name(self):
print('del name')
del self._name
name = property(get_name, set_name, delete_name, doc='name of person')
# 或使用匿名函数
name = property(lambda self:self._name, lambda self, name: setattr(self, '_name', name), lambda self:delattr(self,'_name'))
if __name__ == '__main__':
p = Person()
print(p.name) # 会调用get_name
p.name = 'xxxx' # 会调用set_name
del p.name # 会调用delete_name
property可以手动指定限制的函数,有四个参数,但是这样显得比较麻烦,可以使用装饰器的形式。
class Person(Animal):
_num_ear = 2
@property
def name(self):
return self._name
@name.setter
def name(self, nm):
self._name = nm
@name.deleter
def name(self):
del self._name
if __name__ == '__main__':
p = Person()
print(p.name)
p.name = 'xxxx'
del p.name
一个函数被property装饰后返回的是property对象,只有fget参数的函数可以被property,因为装饰器只接受一个参数;另外的属性设置和删除需要直观调用响应的方法。
abstractmethod
python的抽象类和java不一样,java的抽象类不能实例化,同时抽象方法子类必须实现,否则报错!但是python抽象类默认是可以实例化的,也可以这样说,如果我们对抽象类定义:本身不能实例化,子类必须实现抽象方法;那么我们一般写的基类都不是抽象类。如果想要实现java中的抽象类的效果该怎么办呢?使用abstractmethod装饰器,含义是抽象方法。
一个类中的任何方法被abstractmethod装饰后,这个类不能实例化并且子类必须实现被abstractmethod装饰的方法。
from abc import abstractmethod,ABCMeta
class Animal(metaclass=ABCMeta):
@abstractmethod
def eat(self):
pass
class Person(Animal):
_num_ear = 2
def eat(self):
print('eat thing')
@classmethod
def go(cls):
print(cls._num_ear)
print('go')
如果需要定义一个类是抽象类,那么它需要继承ABCMeta而不是object,这样abstractmethod装饰器才会起作用。其起作用的原理是将一个方法的__isabstractmethod__属性设置为True,这样解释器就会检查子类是否实现了抽象方法。
总结
staticmethod装饰器用来去掉类定义的方法默认传入的第一个参数;
classmethod装饰器用来改变类定义的方法的默认第一个参数,将实例对象改成类对象;
property装饰器用来限制调用者对对象属性的访问;
abstractmethod装饰器设置子类必须实现父类的抽象方法;
参考
python设计模式之内置装饰器使用(四)的更多相关文章
- python基础之内置装饰器
装饰器 简介 功能与格式 内置装饰器 @classmethod @propertry @staticmethod 其它 ---------------------------------------- ...
- python之内置装饰器(property/staticmethod/classmethod)
python内置了property.staticmethod.classmethod三个装饰器,有时候我们也会用到,这里简单说明下 1.property 作用:顾名思义把函数装饰成属性 一般我们调用类 ...
- Python之内置装饰器property
# -*- coding: utf-8 -*- # author:baoshan class Student(object): def __init__(self, name): self.name ...
- python基础-内置装饰器classmethod和staticmethod
面向对象编程之classmethod和staticmethod classmethod 和 staticmethod都是python内置的装饰器 classmethod 的作用:给在类内部定义的方法装 ...
- python中面向对象之装饰器
python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...
- python进阶04 装饰器、描述器、常用内置装饰器
python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...
- python内置装饰器
前言 接着上一篇笔记,我们来看看内置装饰器property.staticmethod.classmethod 一.property装饰器 1. 普通方式修改属性值 code class Celsius ...
- python基础语法16 面向对象3 组合,封装,访问限制机制,内置装饰器property
组合: 夺命三问: 1.什么是组合? 组合指的是一个对象中,包含另一个或多个对象. 2.为什么要用组合? 减少代码的冗余. 3.如何使用组合? 耦合度: 耦: 莲藕 ---> 藕断丝连 - 耦合 ...
- 我终于弄懂了Python的装饰器(四)
此系列文档: 1. 我终于弄懂了Python的装饰器(一) 2. 我终于弄懂了Python的装饰器(二) 3. 我终于弄懂了Python的装饰器(三) 4. 我终于弄懂了Python的装饰器(四) 四 ...
随机推荐
- 当对象使用sort时候 前提是实现compareTo的方法
- uoj54-bzoj3434-时空穿梭
题意 在一个 \(n\) 维空间中,求一个点可以用一个 \(n\) 维向量 \((x_1,x_2,\dots x_n)\) 表示.现在要选出 \(c\) 个点,有三个限制: 设 \(x_i\) 表示任 ...
- Android四大组件之contentProvider
Activity,Service,broadcast and Contentprovider android 4 大组件. ContentProvider:使用: public class Image ...
- 【HLSDK系列】服务端 UpdateClientData 函数
首先说明下,这个函数是写在 mp.dll 里的. 服务器会给每个客户端发送一些数据,其中两大数据种类就是 clientdata_t 和 entity_state_t 这里要说的是 clientdata ...
- 谷哥的小弟学前端(02)——HTML常用标签(2)
探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架 ...
- Uoj308【UNR #2】UOJ拯救计划
分析:比较难分析的一道题,先把式子写出来,ans=∑C(k,i)*f(i),f(i)是选i个颜色的方案数.这个模数有点奇怪,比较小而且是合数,说不定就会有某种规律,如果i >= 3,可以发现C( ...
- git untrack file
git update-index should do what you want This will tell git you want to start ignoring the changes t ...
- 利用StringUtils可以避免空指针问题
这篇文章的来源于在项目中的空指针问题,利用StringUtils可以避免这个空指针问题. 有时候代码中是会出现如下情况if("".equals(str) && st ...
- Codeforces 833B The Bakery dp线段树
B. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
- 手脱Upack 2.x - 3.x
1.PEID查壳 Upack 2.x - 3.x Heuristic Mode -> Dwing 2.载入OD,一上来就是一个大跳转,先F8跟一会 >- E9 56D40300 jmp 跑 ...