流畅的python--函数
# # -*- coding: utf-8 -*-
#
from abc import ABC ,abstractclassmethod
from collections import namedtuple
#amedtuple中的属性都是不可变的。任何尝试改变其属性值的操作都是非法的。
Customer = namedtuple('Customer','name fidelity')
#购物车 total :产品、数量、单价
class lineItem:
"""初始化明细行:产品、数量、单价"""
def __init__(self,product,qty,price):
self.product = product
self.qty = qty
self.price = price
def total(self):
return self.price*self.qty
#订单信息:(客户、购物车、折扣)
class Order:
"""客户、购物车、 促销活动"""
def __init__(self, customer, cart, promotion=None):
self.customer = customer
self.cart = list(cart)
self.promotion = promotion
def total(self):
"""hasattr:用法:判断是否包含对应的属性"""
if not hasattr(self,'__total'):
self.__total = sum(item.total() for item in self.cart) #计算购物车里总金额:
return self.__total
def due(self):
if self.promotion is None:
discount=0
else:
discount = self.promotion.discount(self)
return self.total()-discount
def __repr__(self):
fmt = '<Order total:{:.2f} due :{:.2f}>'
return fmt.format(self.total(),self.due())
class Promotion(ABC): #策略 抽象基类
"""
@abstractmethod:抽象方法,含abstractmethod方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的可以不重写
@ property:方法伪装属性,方法返回值及属性值,被装饰方法不能有参数,必须实例化后调用,类不能调用
@ classmethod:类方法,可以通过实例对象和类对象调用,被该函数修饰的方法第一个参数代表类本身常用cls,被修饰函数内可调用类属性,不能调用实例属性
@staticmethod:静态方法,可以通过实例对象和类对象调用,被装饰函数可无参数,被装饰函数内部通过类名.属性引用类属性或类方法,不能引用实例属性
"""
@abstractclassmethod
def discount(self,order):
"""返回折扣金额、"""
#inhert Promotion
class FidelityPromo(Promotion): #策略1
"""积分为1000或以上的客户提供5%的折扣"""
def discount(self,order):
return order.total()*0.05 if order.customer.fidelity>=1000 else 0
class BulkItemPromo(Promotion):#策略2
"""单个商品为20个或以上时提供10%的折扣"""
def discount(self,order):
discount = 0
for item in order.cart:
if item.quantity>=20:
discount+=item.total()*0.1
return discount
class LargeOrderPromo(Promotion):#策略3
"""订单中不同商品达到10个或以上时提供7%的折扣"""
def discount(self, order):
discount_items = {item.product for item in order.cart}
if len(discount_items)>=10:
return order.total()*0.07
return 0
使用:Order('teddy',long_order,best_promo)
promos=[FidelityPromo,BulkItemPromo,LargeOrderPromo] #1 general 普通
promos=[globals()[name] for name in globals() #2 内省模块 全局模块
if name.endswith('_promo')
and name!='best_promo']
promo=[func for name,func in inspect.getmembers(promotions,inspect.isfunction)] #3 内省单独的promotions
def best_promo(order):
"""return zuida zhekou"""
return max(promo(order) for promo in promos)
inspect.getmembers 函数用来获取函数。
# @property:方法伪装属性,方法返回值及属性值,被装饰方法不能有参数,必须实例化后调用,类不能调用
#@ property
#将一个方法伪装成属性,被修饰的特性方法,内部可以实现处理逻辑,
#但对外提供统一的调用方式,实现一个实例属性的get,set,delete三种方法的内部逻辑,具体含义看示
# -*- coding:utf-8 -*-
class Data: def __init__(self):
self.number = 123 @property
def operation(self):
return self.number @operation.setter
def operation(self, number):
self.number = number @operation.deleter
def operation(self):
del self.number
def wake_up(request, mac='DC-4A-3E-78-3E-0A'):
MAC = mac
BROADCAST = "192.168.0.255"
if len(MAC) != 17:
raise ValueError("MAC address should be set as form 'XX-XX-XX-XX-XX-XX'")
mac_address = MAC.replace("-", '')
data = ''.join(['FFFFFFFFFFFF', mac_address * 20]) # 构造原始数据格式
send_data = b'' # 把原始数据转换为16进制字节数组,
for i in range(0, len(data), 2):
send_data = b''.join([send_data, struct.pack('B', int(data[i: i + 2], 16))])
print(send_data) # 通过socket广播出去,为避免失败,间隔广播三次
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(send_data, (BROADCAST, 7))
time.sleep(1)
sock.sendto(send_data, (BROADCAST, 7))
time.sleep(1)
sock.sendto(send_data, (BROADCAST, 7))
return HttpResponse()
print("Done")
except Exception as e:
return HttpResponse()
print(e)
namedtuple:
namedtuple类位于collections模块,有了namedtuple后通过属性访问数据能够让我们的代码更加的直观更好维护。
namedtuple能够用来创建类似于元祖的数据类型,除了能够用索引来访问数据,能够迭代,还能够方便的通过属性名来访问数据。
在python中,传统的tuple类似于数组,只能通过下表来访问各个元素,我们还需要注释每个下表代表什么数据。通过使用namedtuple,每哥元素有了自己的名字。类似于C语言中的struct,这样数据的意义就可以一目了然。生命namedtuple是非常简单方便的。
from collections import namedtuple user=namedtuple('user', ['age','sex','name'])
user1=user(name='teddy',age=28,sex='M')
user2=user._make(['28','m','teddy']) # 获取用户的属性
print (user1.name) # 修改对象属性,注意要使用"_replace"方法
user1 = user1._replace(age=22) # 将User对象转换成字典,注意要使用"_asdict"
print (user1._asdict())
class MacroCommand:
def __init__(self, commands):
self.commands = lsit(commands)
def __cell__(self):
for command in self.commands:
command()
流畅的python--函数的更多相关文章
- 《流畅的python》读书笔记
流畅的python 第1章 python数据模型 ---1.1 一摞Python风格的纸牌 特殊方法,即__method__,又被称为魔术方法(magic method)或者双下方法(dunder-m ...
- 流畅的python(笔记)
流畅的python中有很多奇技淫巧,整本书都在强调如何最大限度地利用Python 标准库.介绍了很多python的不常用的数据类型.操作.库等,对于入门python后想要提升对python的认识应该有 ...
- 流畅的python 对象引用 可变性和垃圾回收
对象引用.可变性和垃圾回收 变量不是盒子 人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量.Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加 ...
- 《流畅的Python》一副扑克牌中的难点
1.现在在看<流畅的Python>这本书,看了三页就发现,这本书果然不是让新手来入门的,一些很常见的知识点能被这个作者玩出花来, 唉,我就在想,下面要分析的这些的代码,就算我费劲巴拉的看懂 ...
- [读书笔记]流畅的Python(Fluent Python)
<流畅的Python>这本书是图灵科技翻译出版的一本书,作者Luciano Ramalho. 作者从Python的特性角度出发,以Python的数据模型和特殊方法为主线,主要介绍了pyth ...
- 《流畅的Python》Object References, Mutability, and Recycling--第8章
Object References, Mutability, and Recycling 本章章节: Variables Are Not Boxes identity , Equality , Al ...
- 《流畅的Python》 第一部分 序章 【数据模型】
流畅的Python 致Marta,用我全心全意的爱 第一部分 序幕 第一章 Python数据模型 特殊方法 定义: Python解释器碰到特殊句法时,使用特殊方法激活对象的基本操作,例如python语 ...
- Python函数参数和注解是什么
四种参数 Python函数func定义如下: def func(first, *args, second="Hello World", **kwargs): print(first ...
- Python函数装饰器高级用法
在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...
- Pass算子python 函数
Pass算子python 函数 函数 函数是代码的一种组织形式 函数应该能完成一项特定的工作,而且一般一个函数只完成一项工作 有些语言,分函数和过程两个概念,通俗解释是,有返回结果的是函数,无返回结果 ...
随机推荐
- 视频质量评估学习Note
术语"编解码器 Coder/Decoder"是压缩器/解压缩器或编码器/解码器一词的缩写.顾名思义,编码可使视频文件变小以进行存储,然后在需要再次使用时将压缩后的数据转换成可用的图 ...
- 三、Nginx设置用户认证
要求:通过nginx服务端配置实现以下目标 访问web页面需要进行用户认证. 用户名为:tom,密码:123456 操作步骤, 更改配置文件 [root@client ~]# vim /usr/loc ...
- frp实现NAS外网访问
开始 入手了NAS之后就看是漫漫的折腾内网穿透的不归路.用的最多最简单的是下面三种 QC:群晖自带的,速度在100kb左右,能不能连上有时候都是运气,极其不稳定. DDNS:最推荐的方式.上下行都取决 ...
- React Hooks使用避坑指南
函数组件比类组件更加方便实现业务逻辑代码的分离和组件的复用,函数组件也比类组件轻量,没有react hooks之前,函数组件是无法实现LocalState的,这导致有localstate状态的组件无法 ...
- DHCP原理与配置
一.DHCP应用场景 DHCP服务器能够为大量主机分配lp地址,并能够集中管理 二.DHCP报文类型 微软操作系统的DHCP服务是四个广播报文 三.地址池 主机-------------------- ...
- Mysql优化(出自官方文档) - 第六篇
Mysql优化(出自官方文档) - 第六篇 目录 Mysql优化(出自官方文档) - 第六篇 Optimizing Subqueries, Derived Tables, View Reference ...
- 深入学习Netty(1)——传统BIO编程
前言 之前看过Dubbo源码,Nacos等源码都涉及到了Netty,虽然遇到的时候查查资料,后面自己也有私下学习Netty并实践,但始终没有形成良好的知识体系,Netty对想要在Java开发上不断深入 ...
- hive学习笔记之九:基础UDF
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- kotlin gradle 生成jni头文件
目录 问题 解决方法 使用方法 代码 gradle task位置截图 问题 最近在用kotlin写jni,但是生成头文件的时候遇到了些问题. 首先 javah 在java >= 1.9 就被取消 ...
- CentOS-磁盘扩容挂载目录
挂载 查看存储情况 $ df -kh 查看磁盘情况 $ fdisk -l fdisk创建分区(注:可操作存储上限为2TB)$ fdisk /dev/sdb根据提示,依次输入"n", ...