每天学点python-面向对象进阶(3)

以下内容学习自:https://github.com/jackfrued/Python-100-Days

综合案例
案例2:扑克游戏

# -*- coding: utf-8 -*-
"""
Created on Fri Aug 16 10:28:01 2019

@author: fengzi
"""

import random


class Card(object):
    """一张牌"""

    def __init__(self, suite, face):
        self._suite = suite
        self._face = face

    @property
    def face(self):
        return self._face

    @property
    def suite(self):
        return self._suite

    def __str__(self):
        if self._face == 1:
            face_str = 'A'
        elif self._face == 11:
            face_str = 'J'
        elif self._face == 12:
            face_str = 'Q'
        elif self._face == 13:
            face_str = 'K'
        else:
            face_str = str(self._face)
        return '%s%s' % (self._suite, face_str)
    
    def __repr__(self):
        return self.__str__()


class Poker(object):
    """一副牌"""

    def __init__(self):
        self._cards = [Card(suite, face) 
                       for suite in '♠♥♣♦'
                       for face in range(1, 14)]
        self._current = 0

    @property
    def cards(self):
        return self._cards

    def shuffle(self):
        """洗牌(随机乱序)"""
        self._current = 0
        random.shuffle(self._cards)

    @property
    def next(self):
        """发牌"""
        card = self._cards[self._current]
        self._current += 1
        return card

    @property
    def has_next(self):
        """还有没有牌"""
        return self._current < len(self._cards)


class Player(object):
    """玩家"""

    def __init__(self, name):
        self._name = name
        self._cards_on_hand = []

    @property
    def name(self):
        return self._name

    @property
    def cards_on_hand(self):
        return self._cards_on_hand

    def get(self, card):
        """摸牌"""
        self._cards_on_hand.append(card)

    def arrange(self, card_key):
        """玩家整理手上的牌"""
        self._cards_on_hand.sort(key=card_key)


# 排序规则-先根据花色再根据点数排序
def get_key(card):
    return (card.suite, card.face)


def main():
    p = Poker()
    p.shuffle()
    players = [Player('东邪'), Player('西毒'), Player('南帝'), Player('北丐')]
    for _ in range(13):
        for player in players:
            player.get(p.next)
    for player in players:
        print(player.name + ':', end=' ')
        player.arrange(get_key)
        print(player.cards_on_hand)


if __name__ == '__main__':
    main()

在这里插入图片描述
案例3:工资结算系统

# -*- coding: utf-8 -*-
"""
某公司有三种类型的员工 分别是部门经理、程序员和销售员
需要设计一个工资结算系统 根据提供的员工信息来计算月薪
部门经理的月薪是每月固定15000元
程序员的月薪按本月工作时间计算 每小时150元
销售员的月薪是1200元的底薪加上销售额5%的提成


Created on Fri Aug 16 10:41:50 2019

@author: fengzi
"""
from abc import ABCMeta, abstractmethod

class Employee(object, metaclass=ABCMeta):
    """员工"""
    
    def __init__(self, name):
        """
        初始化方法

        :param name: 姓名
        """
        self._name = name
        
    @property
    def name(self):
        return self._name
    
    @abstractmethod
    def get_salary(self):
        """
        获得月薪

        :return: 月薪
        """
        
        pass

class Manager(Employee):
    """部门经理"""
    def get_salary(self):
        return 15000.0
    
class Programmer(Employee):
    """程序员"""
    def __init__(self, name, working_hour=0):
        super().__init__(name)
        self._working_hour = working_hour
            
    @property
    def working_hour(self):
        return self._woring_hour
    
    @working_hour.setter
    def working_hour(self, working_hour):
        self._working_hour = working_hour if working_hour > 0 else 0
        
    def get_salary(self):
        return 150.0 * self._working_hour
    
class Salesman(Employee):
    """销售员"""
    def __init__(self, name, sales=0):
        super().__init__(name)
        self._sales = sales 
        
    @property
    def sales(self):
        return self._sales
    
    @sales.setter
    def sales(self, sales):
        self._sales = sales if sales > 0 else 0
        
    def get_salary(self):
        return 1200.0 + self._sales * 0.05
    
def main():
    emps = [
            Manager("刘备"), Manager("诸葛亮"), Programmer("曹操"), Salesman("荀彧"),
            Salesman("吕布"), Programmer("赵云"), Programmer("孙权")
           ]
    for emp in emps:
        if isinstance(emp, Programmer):
            emp.working_hour = int(input("请输入%s本月工作时间:" % emp.name))
        elif isinstance(emp, Salesman):
            emp.sales = float(input("请输入%s本月销售额:" % emp.name))
         # 同样是接收get_salary这个消息但是不同的员工表现出了不同的行为(多态)
        print("%s本月工资为:¥%s元" % (emp.name, emp.get_salary()))
         
if __name__ == "__main__":
    main()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值