一、@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)

View Code

二、@property  setter deleter

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

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

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

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

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

xiaoming.name = '小狗'  # 改:报错
print(xiaoming.name)

View Code

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

class Circle:def __init__(self,r):self.r = rself.area = 3.14 * self.r ** 2self.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

View Code

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

class Circle:def __init__(self,r):self.r = r@propertydef area(self):return 3.14 * self.r ** 2@propertydef perimeter(self):return 2 * 3.14 * self.rc = 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

View Code

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@propertydef name(self):return self.__name@name.setterdef name(self,new):if type(new) is str:   #因为名字是字符串类型的,我们这样设置可以保证只能用字符串修改名字self.__name = new@name.deleterdef name(self):del self.__namexiaoming = 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.7def __init__(self,price):self.__price = price@propertydef price(self):return self.__price * Fruits.__discount@price.setterdef price(self,new):if type(new) is int or float:self.__price = new@price.deleterdef price(self):del self.__pricebanana = Fruits(10)
print(banana.price)  # 折扣价7.0
banana.price = 9
print(banana.price) # 折扣价6.3del 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  # 对象的私有属性
@propertydef price(self):return self.__price * Fruits.__discount@classmethoddef change_discount(cls,new):  # 类方法默认形参用cls表示,而不用selfcls.__discount = newFruits.change_discount(0.6)
print(Fruits.__dict__)  # '_Fruits__discount': 0.6
类方法的特点:
只使用类中的资源,且这个资源可以直接用类名引用,那这个方法应该被改为一个类方法

四、@staticmethod

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

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

转载于:https://www.cnblogs.com/yidashi110/p/10092244.html

python之装饰器初识相关推荐

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

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

  2. python装饰器函数-Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  3. python三层装饰器-python三大神器===》装饰器

    1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大"神器'(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内 ...

  4. Python之装饰器

    Python之装饰器 在不修改函数调用方式的前提下,也不能修改函数内部源代码!!!! 例如: 在每个季度公司发绩效,统计每个人的代码执行效率.咱们总不能是每个函数里加time模块吧. import t ...

  5. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  6. 浅谈Django的中间件与Python的装饰器

    浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...

  7. Python的装饰器

    详解Python的装饰器 本文源码 https://github.com/tobyqin/python_decorator Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都 ...

  8. python 日志 装饰器_【Python】装饰器实现日志记录

    好的日志对一个软件的重要性是显而易见的.如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法.后来用python写一些软件,了解到python的装饰器功能时,突然人 ...

  9. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...

最新文章

  1. HDU 5834 Magic boy Bi Luo with his excited tree
  2. java 获取活动窗口_用Java获取活动窗口信息
  3. python 二叉树递归时明明已经得到了结果,但是返回None
  4. 官宣!阿里进军 5G,成立 XG 实验室发力新基建
  5. Register Delphi ,Delphi 不能运行
  6. JavaScript常见的运算符优先级面试题
  7. 2001年李彦宏DoNews三篇搜索引擎Blog
  8. 由两个曲面确定的交线的切向量求解
  9. 【博客之星】总结和分享是一种习惯
  10. 数学问题:矩阵运算法则及矩阵求导
  11. jmeter实现手机号归属地接口测试案例
  12. Queue与Topic区别
  13. 以艺术教育培养大学生艺术素质
  14. TW6869 drivers porting for freescaleandroid
  15. 用java计算小数的双阶乘
  16. Excel匹配两列相同内容到同一行
  17. java进阶----集合
  18. PostgreSQL元命令介绍
  19. 电脑直播测试软件,微信电脑版发布 3.2.1 测试版:可观看、发起视频号直播,提供手机直播工具...
  20. c语言向字符串追加一个字符串,C语言字符串拼接和追加.doc

热门文章

  1. March 2007 CTP Linq 的一些改变
  2. 《Cisco IPv6网络实现技术(修订版)》一2.6 配置练习:使用Cisco路由器配置一个IPv6网络...
  3. 安全系列------web环境搭建组合
  4. CCNA Cisco 端口配置(上)
  5. 【vSphere系列二】安装 Openfiler 存储
  6. 封装+构造方法小例子
  7. 实时计字数提醒的文本框
  8. 关于C#写的记事本中一个问题
  9. 多个Google账户合并(共享)数据
  10. 《互联网项目运营分析》第四章 :互联网项目的技术选择与应用