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的装饰器(四) 四 ...
随机推荐
- 2017 ACM Arabella Collegiate Programming Contest(solved 9/13, complex 12/13)
A.Sherlock Bones 题意: 给出长度为n的01串,问f(i,j)=f(j,k),(i<j<k)的i,j,k取值种数.其中f(i,j)表示[i,j]内1的个数, 且s[j]必须 ...
- 题解 P1334 【瑞瑞的木板】
声明:本题解已经与其他题解重合, ### 且存在压行情况. 首先,这个题解是我有了惨痛的教训:全部WA... 先发一个CODE做声明: #include <bits/stdc++.h> / ...
- 🔺Count on a tree SPOJ - COT (无能为力。。。)
https://cn.vjudge.net/problem/SPOJ-COT 插上 大佬的代码 和 我的...以后再看吧... Count on a tree 大佬:http://www.cnblog ...
- Mybatis笔记三:iBatis与MyBatis区别
转载:http://www.tuicool.com/articles/auaAru iBatis 框架的主要优势: 1.iBatis 封装了绝大多数的 JDBC 样板代码,使得开发者只需关注 SQL ...
- Round 403 div. 2
B 可以二分相遇的坐标:也可以二分时间,判断是否存在两个人的区间没有交. An easy way to intersect a number of segments [l1, r1], ..., [l ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告
4864: [BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子. ...
- 使当前对象相对于上层DIV 水平、垂直居中定位
<!doctype html> <html> <head> <meta http-equiv="content-type" content ...
- Hive(六)hive执行过程实例分析与hive优化策略
一.Hive 执行过程实例分析 1.join 对于 join 操作:SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.useri ...
- 04-树5. File Transfer--并查集
对于一个集合常见的操作有:判断一个元素是否属于一个集合:合并两个集合等等.而并查集是处理一些不相交集合(Disjoint Sets)的合并及查询问题的有利工具. 并查集是利用树结构实现的.一个集合用一 ...
- Netfilter之连接跟踪实现机制初步分析
Netfilter之连接跟踪实现机制初步分析 原文: http://blog.chinaunix.net/uid-22227409-id-2656910.html 什么是连接跟踪 连接跟踪(CONNT ...