美文网首页
Day31--课后作业(josephu环、数据封装)

Day31--课后作业(josephu环、数据封装)

作者: zxhlcl | 来源:发表于2018-11-15 00:15 被阅读0次

1、josephu环
30个人在一个破船上,其中有15个教徒和15个非教徒,由于破船无法承载30个人前行,必须随机搞掉15人,于是有人出了一个馊主意,30个人手拉手组成一个环,由某一个人从1开始报数,依次递增,报数为9的人被扔到海里面,然后后续人员接着开始从1报数,依次类推;由于神灵保佑,被扔下的15人均为非教徒,请问着15个教徒最初是站在什么位置的。

josephu=list(range(1,31))
    for _ in range(15):
    josephu=josephu[9:]+josephu[0:8]

2、计算员工工资收入
员工的信息在配置文件中,配置文件是xml格式,读取信息封装成类,其中采用工厂方法模式,根据员工的职位生成不同的对象,再计算对象的工资。
思考:
1、可以把计算后的工资写入到xml
2、员工信息可以采用json的格式
3、可以先写一个页面录入员工信息,再提交给后台处理

xml如下:路径为filepath = './file/employee.xml'

<?xml version="1.0" encoding="UTF-8"?>
<!--manager\programer\saleman-->
<company name="Dog shit">
    <employee>
        <name>张飞</name>
        <age>20</age>
        <position>programer</position>
        <time>5</time>
        <amount>null</amount>
        <salary>null</salary>
    </employee>
    <employee>
        <name>刘备</name>
        <age>20</age>
        <position>manager</position>
        <time>null</time>
        <amount>null</amount>
        <salary>null</salary>
    </employee>
    <employee>
        <name>关羽</name>
        <age>20</age>
        <position>saleman</position>
        <time>null</time>
        <amount>10</amount>
        <salary>null</salary>
    </employee>
</company>

xml的解析模块如下:
返回值是由员工信息组成的列表,每个员工信息为一个字典

from xml.dom import minidom

def get_attrvalue(node, attrname):
    return node.getAttribute(attrname) if node else ''
def get_nodevalue(node, index=0):
    return node.childNodes[index].nodeValue if node else ''
def get_xmlnode(node, name):
    return node.getElementsByTagName(name) if node else []
def get_xml_data(filepath):
    doc = minidom.parse(filepath)
    root = doc.documentElement
    employee_nodes = get_xmlnode(root, 'employee')
    employee_list=[]
    for node in employee_nodes:
        node_name = get_xmlnode(node, 'name')
        node_age = get_xmlnode(node, 'age')
        node_position = get_xmlnode(node, 'position')
        node_time = get_xmlnode(node, 'time')
        node_amount = get_xmlnode(node, 'amount')
        node_salary =get_xmlnode(node, 'salary')

        employee_name =get_nodevalue(node_name[0])
        employee_age = get_nodevalue(node_age[0])
        employee_position = get_nodevalue(node_position[0])
        employee_time = get_nodevalue(node_time[0])
        employee_amount=get_nodevalue(node_amount[0])
        employee_salary = get_nodevalue(node_salary[0])

        employee = {}
        employee['name'] =employee_name
        employee['age'] = employee_age
        employee['position'] = employee_position
        employee['time'] =employee_time
        employee['amount'] =employee_amount
        employee['salary']= employee_salary
        employee_list.append(employee)
    return  employee_list

工厂方法如下:
分别构建对象,形成对象队列,并打印对象的工资
其实定义的不同的类可以抽象一个抽象类,继承后可以不用写初始化方法

import  modules.xmlpraser as XML

# 定义工厂方法
def get_class(p,**param):
    if p=="manager":
        return Manager(**param)
    elif p=="saleman":
        return Saleman(**param)
    elif p=="programer":
        return Programer(**param)

# 定义类
class Manager:
    def __init__(self, **param):
        for k, v in param.items():
            setattr(self, k, v)

    def get_salary(self):
        self.salary=15000
        return self.salary

class Saleman:
    def __init__(self, **param):
        for k, v in param.items():
            setattr(self, k, v)
    def get_salary(self):
        self.salary=1800+0.05*10000*int(self.amount)
        return self.salary

class Programer:
    def __init__(self, **param):
        for k, v in param.items():
            setattr(self, k, v)
    def get_salary(self):
        self.salary=int(self.time)*22*200
        return self.salary

# 获取数据并创建类
filepath = './file/employee.xml'
employee_list=XML.get_xml_data(filepath)
emp_list=[] #用于保存不同的employee对象
for employee in employee_list:
    p=employee["position"]
    emp=get_class(p,**employee)
    emp_list.append(emp)
##打印不同对象的工资
for emp in emp_list:
    print(emp.get_salary())

注意:采用不定长参数的时候,不要重复赋值,否则会报错,如下

Traceback (most recent call last):
  File "E:/Python/阶段1/pyechart_self_learning/employee.py", line 44, in <module>
    emp=get_class(position,**employee)
TypeError: get_class() got multiple values for argument 'position'

相关文章

网友评论

      本文标题:Day31--课后作业(josephu环、数据封装)

      本文链接:https://www.haomeiwen.com/subject/jifefqtx.html