流畅的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

 
# @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)

猜你喜欢

转载自www.cnblogs.com/1314520xh/p/12821789.html