10 面向对象编程脚本实例


面向对象编程脚本实例

  • 计算器对象的编写实例

    # 通过面相对象实现一个计算器
    
    class Caculator:
        #定义一个装饰器判断数据类型
        def __judge(func):
            def judge2(self,num):
                if not isinstance(num,int):
                    raise TypeError('当前数据类型有问题,应该是整型数据')
                return func(self,num)
            return judge2
    		#初始化
        def __init__(self):
            self.__result=0
    		#装饰器实现语音播报
        def outer(x=''):
            def __say(func):
                def inner(self,num):
                    print('%s%d'%(x,num))
                    return func(self,num)
                return inner
            return __say
    
        @__judge
        @outer()
        def first_value(self, v):
            self.__result = v
    
        @__judge
        @outer('+')
        def jia(self, n):
            self.__result += n
            return self
    
        @__judge
        @outer('-')
        def jian(self, n):
            self.__result -= n
            return self
    
        @__judge
        @outer('*')
        def cheng(self, n):
            self.__result *= n
            return self
    
        def show(self):
            print('计算的结果是:%d'%self.__result)
            return self
    		#实现可以直接查询结果
        @property
        def result(self):
            return self.__result
        #清除数据
        def clear(self):
            self.__result=0
            return self
    
    c1=Caculator()
    print(c1.jia(5).jian(2).show())
    print(c1.result)
    
  • 一个数字时钟类

    #定义一个类描述数字时钟
    
    from time import sleep
    
    class Clock:
        '''
        数字时钟
        '''
        def __init__(self,hour=0,minute=0,second=0):
            self._hour=hour
            self._minute=minute
            self._second=second
    
        def run(self):
            '''
            走字
            :return:
            '''
            self._second+=1
            if self._second==60:
                self._second=0
                self._minute+=1
                if self._minute==60:
                    self._minute=0
                    self._hour+=1
                    if self._hour==24:
                        self._hour=0
    
        def show(self):
            '''
            显示时间
            :return:
            '''
            return '%02d:%02d:%02d'%(self._hour,self._minute,self._second)
    
    def main():
        clock=Clock(23,59,58)
        while True:
            print(clock.show())
            sleep(1)
            clock.run()
    
    if __name__ == '__main__':
        main()
    
  • 打怪兽游戏

    from abc import ABCMeta,abstractmethod
    from random import randint,randrange
    
    class Fighter(metaclass=ABCMeta):
        '''
        战斗者
        '''
        #通过魔法方法限定绑定的属性
        __slots__ = ('_name','_hp')
    
        def __init__(self,name,hp):
            self._name=name
            self._hp=hp
        #将名字设置为只读属性
        @property
        def name(self):
            return self._name
        #将hp设置为读写属性
        @property
        def hp(self):
            return self._hp
        @hp.setter
        def hp(self,hp):
            self._hp=hp if hp>=0 else 0
        #定义存活方法为一个属性
        @property
        def alive(self):
            return self._hp>0
        #定义抽象方法攻击方式
        @abstractmethod
        def attack(self,other):
            pass
    
    #奥特曼类,是Fighter类的子类
    class Ultraman(Fighter):
        #有血量、蓝量、名字
        __slots__ = ('_name','_hp','_mp')
    
        def __init__(self,name,hp,mp):
            super().__init__(name,hp)
            self._mp=mp
    
        def attack(self,other):
            other.hp-=randint(15,25)
    
        def huge_attack(self,other):
            '''
            必杀技:打掉对面四分之三的血量,最少也打五十,蓝量不足会失败
            :param other: 被攻击对象
            :return: 是否释放大招成功
            '''
            if self._mp>=50:
                self._mp-=50
                injury=other.hp*3//4
                injury=injury if injury>=50 else 50
                other.hp-=injury
                return True
            else:
                self.attack(other)
                return False
    
        def magic_attack(self,others):
            '''
            魔法攻击是群体攻击,蓝量不足会失败
            :param others: 被攻击的群体
            :return: 是否施法成功
            '''
            if self._mp>=20:
                self._mp-=20
                for temp in others:
                    if temp.alive:
                        temp.hp-=randint(10,15)
                return True
            else:
                return False
    
        def resume(self):
            '''
            回蓝
            :return:回蓝量
            '''
            incr_point=randint(1,10)
            self._mp+=incr_point
            return incr_point
    
        def __str__(self):
            return '---%s奥特曼---\n'%self._name+\
                '生命值:%d\n'%self._hp+\
                '魔法值:%d\n'%self._mp
    
    class Monster(Fighter):
        '''
        小怪
        '''
        __slots__ = ('_name','_hp')
    
        def attack(self,other):
            other.hp-=randint(10,20)
    
        def __str__(self):
            return '---%s小怪---\n'%self._name+\
                '生命值:%d\n'%self._hp
    
    #是否还有小怪活着
    def is_alive(monsters):
        '''
    
        :param monsters:
        :return: 是否还活着
        '''
        for monster in monsters:
            if monster.alive:
                return True
        return False
    
    #选定一只活着的怪兽
    def select_alive_one(monsters):
        monsters_len=len(monsters)
        while True:
            index=randrange(monsters_len)
            monster=monsters[index]
            if monster.alive:
                return monster
    
    #显示信息
    def display_info(ultraman,monsters):
        print(ultraman)
        for monster in monsters:
            print(monster,end='')
    
    def main():
        u=Ultraman('顺利',1000,120)
        m1=Monster('001',250)
        m2=Monster('002',550)
        m3=Monster('003',1050)
        m4=Monster('004',800)
        monsters=[m1,m2,m3,m4]
        fight_round=1
        while u.alive and is_alive(monsters):
            print('===第%d回合==='%fight_round)
            #选中一只小怪
            m=select_alive_one(monsters)
            # 通过随机数选择使用技能
            skill_rate=randint(1,10)
            if skill_rate<=6:
                print('%s使用普通攻击打了%s'%(u.name,m.name))
                u.attack(m)
                print('%s恢复魔法值%d点'%(u.name,u.resume()))
            elif skill_rate<=9:
                if u.magic_attack(monsters):
                    print('%s使用魔法攻击' % u.name)
                else:
                    print('%s使用魔法失败' % u.name)
            else:
                if u.huge_attack(m):
                    print('%s使用大招打了%s' % (u.name, m.name))
                else:
                    print('%s使用普通攻击打了%s' % (u.name, m.name))
                    u.attack(m)
                    print('%s恢复魔法值%d点' % (u.name, u.resume()))
            if m.alive:
                print('%s回击了%s.' % (m.name, u.name))
                m.attack(u)
            display_info(u,monsters)
            fight_round+=1
        print('---战斗结束!---')
        if u.alive:
            print('奥特曼胜利')
        else:
            print('小怪胜利')
    
    if __name__ == '__main__':
        main()
    
  • 扑克游戏

    import random
    
    class Card():
        '''
        单张牌类
        '''
        def __init__(self,suite,number):
            '''
    
            :param suite:花色
            :param number: 牌面
            '''
            self._suite=suite
            self._number=number
    
        #将牌面和花色都设置为只读属性
        @property
        def number(self):
            return self._number
    
        @property
        def suite(self):
            return self._suite
    
        def __str__(self):
            if self._number==1:
                num_str='A'
            elif self._number==11:
                num_str='J'
            elif self._number==12:
                num_str='Q'
            elif self._number==13:
                num_str='K'
            else:
                num_str=str(self._number)
            return '%s%s'%(self._suite,num_str)
    
        __repr__=__str__
    
    class Poker():
        '''
        一副牌
        '''
        def __init__(self):
            self._cards=[Card(suite,number) for suite in '????' for number 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_card(self):
            '''
            发牌
            :return:
            '''
            card=self._cards[self._current]
            self._current+=1
            return card
    
        @property
        def has_next(self):
            '''
            还有牌吗
            :return:
            '''
            return self._current
  • 工资结算系统

    #工资结算系统
    """
    某公司有三种类型的员工 分别是部门经理、程序员和销售员
    需要设计一个工资结算系统 根据提供的员工信息来计算月薪
    部门经理的月薪是每月固定15000元
    程序员的月薪按本月工作时间计算 每小时150元
    销售员的月薪是1200元的底薪加上销售额5%的提成
    """
    from abc import ABCMeta,abstractmethod
    
    class Eployee(metaclass=ABCMeta):
        '''
        员工类
        '''
        def __init__(self,name):
            self._name=name
    
        @property
        def name(self):
            return self._name
    
        @abstractmethod
        def salary(self):
            pass
    
    class Manager(Eployee):
        def salary(self):
            return 15000.0
    
    class Programmer(Eployee):
        def __init__(self,name,working_time=0):
            super().__init__(name)
            self._working_time=working_time
    
        @property
        def working_time(self):
            return self._working_time
    
        @working_time.setter
        def working_time(self,working_time):
            self._working_time=working_time if working_time>0 else 0
    
        def salary(self):
            return 150.0*self._working_time
    
    class Salesman(Eployee):
        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 salary(self):
            return 1200.0+self._sales*0.05
    
    def main():
        emps = [
            Manager('刘备'), Programmer('诸葛亮'),
            Manager('曹操'), Salesman('荀彧'),
            Salesman('吕布'), Programmer('张辽'),
            Programmer('赵云')
        ]
        for emp in emps:
            if isinstance(emp,Programmer):
                emp.working_time=int(input('请输入%s本月工作时间: ' % emp.name))
            elif isinstance(emp,Salesman):
                emp.sales=float(input('请输入%s本月销售额: ' % emp.name))
            print('%s本月工资为: ¥%s元' %
                  (emp.name, emp.salary()))
    
    if __name__ == '__main__':
        main()