zoukankan      html  css  js  c++  java
  • 流畅的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()
  • 相关阅读:
    [翻译]NUnitString && Collection && File && Directory Assert (七)
    c++删除指定字符串之间的内容(比正则表达式快几十倍)[转]
    C++ 使用正则表达式分割字符串
    c++正则查找
    PHP的XSS攻击过滤函数
    Boost之正则表达式_[转]
    C++中的类所占内存空间总结[转]
    make_shared() shared_prt()详解区别
    C++ STRING 和WSTRING 之间的互相转换函数 和字符串替换
    LConfig:利用Lua脚本做程序的配置文件 [转]
  • 原文地址:https://www.cnblogs.com/1314520xh/p/12821789.html
Copyright © 2011-2022 走看看