流畅的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 函数 函数 函数是代码的一种组织形式 函数应该能完成一项特定的工作,而且一般一个函数只完成一项工作 有些语言,分函数和过程两个概念,通俗解释是,有返回结果的是函数,无返回结果 ...
随机推荐
- 小白学k8s(8)-Bazel部署go应用
Bazel使用了解 Bazel产生的背景 什么是Bazel 快(Fast) 可伸缩(scalable) 跨语言(multi-language) 可扩展(extensible) Bazel中的主要文件 ...
- redis学习第三天(Java使用redis)
Java使用redis首先需要一个jar包,jedis.jar,这边给出下载地址:https://mvnrepository.com/artifact/redis.clients/jedis,要下载最 ...
- Spring Boot下的一种导入Excel文件的代码框架
1.前言 Spring Boot下如果只是导入一个简单的Excel文件,是容易的.网上类似的文章不少,有的针对具体的实体类,代码可重用性不高:有的利用反射机制或自定义注解,开发了Excel导入工具 ...
- 计算机网络的参考模型与5G协议
一.分层思想 二.OSI七层参考模型 三.FPC/IP五层模型 四.数据的封装过程与PDU(协议数据单元) 五.数据的解封装过程 六.各层间通信与设备与层的对应关系 七.总结 一.分层思想 将复杂的 ...
- 14.6、redis集群
1.环境配置: 服务器名称 ip地址 实例6379 实例6380 实例6381 实例6381 实例6381 实例6381 controller-node1 172.16.1.90 主 从 主 从 主 ...
- 5、mysql_sql语言介绍
5.1.什么是sql: 总结:sql语句是关系型数据库的结构化查询和程序设计语言: 5.2.sql的分类: 1.数据库查询语言(DQL): select user,host,password from ...
- JS replace 替换全部数据
(1)使用具有全局标志g的正则表达式 var str = "dogdogdog"; var str2 = str.replace(/dog/g,"cat");/ ...
- AcWing 243. 一个简单的整数问题2
给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1."C l r d",表示把 A[l],A[l+1],-,A[r] 都加上 d. 2."Q l r ...
- 资源:Maven相关jar快速下载地址
Maven下载海外jar包太慢,可以进入下面地址搜索下载 下载地址:https://www.findjar.com/
- Java:Java的<<<移位运算符详解
1) 左移运算(<<) 左移就是把所有位向左移动几位 如: 12 << 2 意思就是12向左移动两位 12的二进制是: 0000 1100 通过这个图我们 ...