一、@abstractmethod

1、抽象类的作用:规范编程模式
多人开发、复杂的需求、后期的扩展
是一种用来帮助我们完成规范化的手段

2、如何定义抽象类
1,from abc import ABCMeta,abstractmethod
2,在这个类创建的时候指定 metaclass = ABCMeta
3,在你希望子类要实现的方法的上一行加上一个 @abstractmethod装饰器

3、使用抽象类
1,继承这个类
2,必须实现这个类中被@abstractmethod装饰器装饰的方法

4、实例

# 支付功能

from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta): # 模板的功能
@abstractmethod # abstractmethod是一个装饰器,装饰器怎么用?放在函数或者类的上一行
def pay(self): pass # 这样就构建了一个抽象类Payment,并声明了子类必须要实现的方法是 pay(),若子类没有定义pay(),则实例化时会报错 class Alipay(Payment): # 继承了抽象类,就必须实现抽象类中被@abstractmethod装饰器装饰的方法 pay()
def pay(self, money):
print('使用支付宝支付了%s元' % money) class Wechatpay(Payment):
def pay(self, money):
print('使用微信支付了%s元' % money) class My_pay(Payment): # 这里没有定义pay()方法,那么在实例化的时候机会报错
def fuqian(self,money):
print('你支付了%s元' % money) def pay(obj, money):
obj.pay(money) # p = Payment() # 报错 抽象类不能被实例化 a = Alipay()
# a.pay(100)
pay(a,100) # 使用支付宝支付了100元 we = Wechatpay()
# we.pay(200)
pay(we,200) # 使用微信支付了200元 my = My_pay() # 报错:类中没有定义抽象类的pay方法
pay(my,300)

二、@property  setter deleter

1、
装饰器的分类:
装饰函数
装饰方法 : property
装饰类

装饰器函数都怎么用:
在函数、方法、类的上面一行直接@装饰器的名字

2、property是一个装饰器函数(就是用来解决刚才私有属性的问题)
property:将一个方法伪装成一个属性

2-1学生信息中,姓名不想给别人修改,就设置为私有属性,在定义一个同名的方法伪装成属性,便于查找

class Student:
def __init__(self,name,age):
self.__name = name
self.age = age @property
def name(self): # 声明了@property使用此方法的时候就可以不写括号,就伪装成了属性
return self.__name xiaoming = Student('小明',18)
print(xiaoming.name) # 小明 xiaoming.name = '小狗' # 改:报错
print(xiaoming.name)

2-2圆的半径可以修改,但是面积和周长应该是属性的形式比较正确,但是直接设置为属性,圆的半径改了后,
周长和面积并不会改变

class Circle:
def __init__(self,r):
self.r = r
self.area = 3.14 * self.r ** 2
self.perimeter = 2 * 3.14 * self.r
c = Circle(6)
print(c.area) # 113.04
print(c.perimeter) # 37.68 c.r = 3 # 改变了半径
print(c.area) # 113.04
print(c.perimeter) # 37.68

2-3因此上面的圆可以写成这样:

class Circle:
def __init__(self,r):
self.r = r @property
def area(self):
return 3.14 * self.r ** 2 @property
def perimeter(self):
return 2 * 3.14 * self.r c = Circle(6)
print(c.area) # 113.04
print(c.perimeter) # 37.68 c.r = 3 # 改变了半径
print(c.area) # 28.26
print(c.perimeter) # 18.84

2-4完整的property

1、定义
一个方法被伪装成属性之后,应该可以执行一个属性的增删改查操作,
增加和修改就对应着被setter装饰的方法,
删除一个属性对应着被deleter装饰的方法。

@property:把方法伪装成属性

@被property装饰的方法名.setter:
当被property装饰的方法,又实现了一个同名方法,且被setter装饰器装饰了,
那么在对被装饰的方法赋值的时候,就会触发被setter装饰器装饰的方法,
这个方法必须要传一个参数接收等号后面的值,
是用来保护一个变量在修改的时候能够添加一些保护条件。

@被property装饰的方法名.deleter:
当被property装饰的方法,又实现了一个同名方法,且被deleter装饰器装饰了,
那么在对被装饰的方法进行删除的操作时,就会触发被deleter装饰器装饰的方法,
这个方法并不能在执行的时候真的删除这个属性,而是你在代码中执行什么就有什么效果.

2、例题

学生类
class Student:
def __init__(self,name):
self.__name = name @property
def name(self):
return self.__name @name.setter
def name(self,new):
if type(new) is str: #因为名字是字符串类型的,我们这样设置可以保证只能用字符串修改名字
self.__name = new @name.deleter
def name(self):
del self.__name xiaoming = Student('小明')
print(xiaoming.name) #小明 xiaoming.name = 123 # 不是字符串修改不了
print(xiaoming.name) # 小明 xiaoming.name = '小花猫'
print(xiaoming.name) # 小花猫 del xiaoming.name
print(xiaoming.__dict__) # {} 空字典 水果类:
class Fruits:
__discount = 0.7 def __init__(self,price):
self.__price = price @property
def price(self):
return self.__price * Fruits.__discount @price.setter
def price(self,new):
if type(new) is int or float:
self.__price = new @price.deleter
def price(self):
del self.__price banana = Fruits(10)
print(banana.price) # 折扣价7.0 banana.price = 9
print(banana.price) # 折扣价6.3 del banana.price
print(banana.__dict__) # {} 空字典

3、总结:
被setter和deleter装饰的方法名必须和被property装饰的方法名一致,对象.方法名 不加括号 可以调用被property装饰的方法,
当对被property装饰的方法赋值时,就会触发被setter装饰的方法,当对被property装饰的方法进行删除del操作时,就会触发
被deleter装饰的方法。
注意:(一般来说用的最多的是property,其他两个看情况而使用)

三、@classmethod

类方法:
用@classmethod装饰
类方法默认形参用cls表示,而不用self
可以直接通过类去修改类的属性,不需要实例化

class Fruits:
__discount = 0.7 # 类的静态属性 def __init__(self,price):
self.__price = price # 对象的私有属性 @property
def price(self):
return self.__price * Fruits.__discount @classmethod
def change_discount(cls,new): # 类方法默认形参用cls表示,而不用self
cls.__discount = new Fruits.change_discount(0.6)
print(Fruits.__dict__) # '_Fruits__discount': 0.6 类方法的特点:
只使用类中的资源,且这个资源可以直接用类名引用,那这个方法应该被改为一个类方法

四、@staticmethod

静态方法
被@staticmethod装饰的方法,不使用类中的命名空间也不使用对象的命名空间,
可以传参,也可以不传参,没有默认参数(self,cls),相当于一个类外的普通的方法,
不同的是调用的时候需要 类名.方法名

class Student:
@staticmethod
def login():
print('登录成功') Student.login())

python之装饰器初识的更多相关文章

  1. python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)

    一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...

  2. 13.Python略有小成(装饰器,递归函数)

    Python(装饰器,递归函数) 一.开放封闭原则 ​ 软件面世时,不可能把所有的功能都设计好,再未来的一两年功能会陆续上线,定期更新迭代,软件之前所用的源代码,函数里面的代码以及函数的调用方式一般不 ...

  3. python初始装饰器

    python装饰器: 一,函数名的运用. 函数名是一个变量,但他是一个特殊的变量与括号配合可以执⾏行行函数的变量 1.函数名的内存地址 def func(): print("呵呵" ...

  4. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  5. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

  6. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  7. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  8. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  9. python 基础——装饰器

    python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...

随机推荐

  1. WEB 实时推送技术的总结

    前言 随着 Web 的发展,用户对于 Web 的实时推送要求也越来越高 ,比如,工业运行监控.Web 在线通讯.即时报价系统.在线游戏等,都需要将后台发生的变化主动地.实时地传送到浏览器端,而不需要用 ...

  2. angularjs+webapi2 跨域Basic 认证授权(二)

    在上一篇中大概演示了 整个认证授权的过程.今天在这篇博客中将结合上一篇的例子继续在跨域的情况 我们用ionic 写一个简单的页面 值得注意的是 在ionic.bundle.js 里面集成了angula ...

  3. 一种提升连接Dynamics 365性能的方法

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复256或者20170512可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  4. 深度 | AI芯片终极之战

    深度 | AI芯片终极之战 https://mp.weixin.qq.com/s?__biz=MzA4MTQ4NjQzMw==&mid=2652712307&idx=1&sn= ...

  5. 仿9GAG制作过程(三)

    有话要说: 这次准备讲述后台服务器的搭建以及前台访问到数据的过程. 成果: 准备: 安装了eclipse 安装了Tomcat7 安装了数据库管理工具:Navicat 搭建服务器: 用eclipse直接 ...

  6. MPP架构海量数据分析仓库——Greenplum介绍

    一.Greenplum背景 时间回到2002年,互联网行业经过近10年的发展,数据量正处于快速增长期: 1.传统的主机计算模式在海量数据面前,除了造价昂贵外,在CPU计算和IO吞吐上不能满足海量数据的 ...

  7. JS第三部分--BOM浏览器对象模型

    一.client系列:宽高边框 二.offset系列:偏移 三.scroll系列 四.BOM的介绍 4.1.打开新窗口 4.2.location对象(本地信息对象) 4.3.history对象 4.4 ...

  8. django 视图模式

    一 视图 FBV --- function based view(基于函数视图) CBV --- class based view(基于类的视图函数) 二 请求方式 get post put/patc ...

  9. SQL解析在美团的应用

    https://tech.meituan.com/SQL_parser_used_in_mtdp.html 数据库作为核心的基础组件,是需要重点保护的对象.任何一个线上的不慎操作,都有可能给数据库带来 ...

  10. CentOS 7 中使用NTP进行时间同步

    1. NTP时钟同步方式说明NTP在linux下有两种时钟同步方式,分别为直接同步和平滑同步: 直接同步 使用ntpdate命令进行同步,直接进行时间变更.如果服务器上存在一个12点运行的任务,当前服 ...