zoukankan      html  css  js  c++  java
  • python开发面向对象基础:人狗大战学面向对象

    一,通过函数写人狗大战这个故事

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 #1.函数  人模子
     5 def person(name,level,life_value):
     6     p_dic = {
     7         'name':name,
     8         'level':level,
     9         'life_value':life_value
    10     }
    11     return p_dic
    12 joker = person('joker',100,4000)
    13 
    14 #函数  狗模子
    15 def dog(name,breed,live_value):
    16     d_dic = {
    17         'name': name,
    18         'breed': breed,  #(品种)
    19         'live_value': live_value
    20     }
    21     return d_dic
    22 dahei = dog('dahei','',10000)
    23 
    24 #函数  定义人的攻击
    25 def attack(person):   #定义人攻击
    26     print('%s在攻击'%person['name'])
    27 attack(joker)      #将Joker的返回值的字典传入,获取字典相应的值
    28 
    29 #函数  定义狗的攻击
    30 def bite(dog):      #定义狗攻击
    31     print('%s在咬'%dog['name'])
    32 bite(dahei)        #将dahei的返回值的字典传入,获取字典相应的值
    

     **上面的调用很完美但是如果出现下面的情况的话,你会分不清楚谁攻击,谁咬死

      attack(dahei)   #这个攻击是人的属性,狗也可以了
      bite(joker)     #这个攻击时狗的属性,人也可以了

    二,通过嵌套函数去写

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 def person(name,level,life_value):
     5     def attack():                             #把这个攻击定义在人里面
     6         print('%s在攻击' %p_dic['name'])
     7     p_dic = {
     8         'name':name,
     9         'level':level,
    10         'life_value':life_value,
    11         'attack':attack
    12     }
    13     return p_dic
    14 
    15 def dog(name,breed,live_value):
    16     def bite():                               #把这个攻击定义在狗里面
    17         print('%s在咬' % d_dic['name'])
    18     d_dic = {
    19         'name':name,
    20         'breed':breed,
    21         'live_value':live_value,
    22         'bite':bite
    23     }
    24     return d_dic
    25 
    26 joker = person('joker',100,4000)
    27 dahei = dog('dahei','',10000)
    28 joker['attack']()        #这样调用的话就没有问题了,字典方式调用
    29 dahei['bite']()

     **上面的函数嵌套很完美但是如果我想现在定义个吃,玩的属性,难道你要在每个嵌套函数里面加字典的kev么
     **注意:实现吃,玩的属性,不能在外面单独写吃的函数,因为不能确定谁去吃,写在里面又会出现代码重复的情况

    三,面向对象的定义

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 class Person:
     5     role = '中国人'    #属性—— 静态属性--类属性  例子中用不到
     6     def __init__(self,name):  #传参
     7         print('there here')
     8         print(name)
     9     def attack(self):  #方法——动态属性
    10         print('攻击')
    11 # print(Person.role)   #类名.属性
    12 # print(Person.attack) #类名.方法  打印出来的是内存地址
    13 # joker = Person()  #调用,首先执行init方法(构造函数) self就是joker
    14 # joker = Person('joker')   #有参数,init也是相对应得需要参数

    3.1 上面代码解释成函数为

     1 #!/usr/bin/env python
     2 #_*_coding;utf-8_*_
     3 
     4 def Person(*args,**kwargs):
     5     self = {}
     6     def __init__(name,life_value,aggr):
     7         self['name'] = name
     8         self['life_value'] = life_value
     9         self['aggr'] = aggr
    10         return self
    11     self_ret =  __init__(*args,**kwargs)
    12     return self_ret
    13 # joker =Person('joker',1000,500)

    3.2 人人大战

     1 #!/usr/bin/env python
     2 #_*_coding;utf-8_*_
     3 
     4 class Person:
     5     role = '中国人'    #属性—— 静态属性
     6     def __init__(self,name,life_value,aggr):
     7         self.name = name
     8         self.life_value = life_value
     9         self.aggr = aggr
    10     def attack(self,enemy):  #方法——动态属性,enemy对象,攻击谁
    11         enemy.life_value = enemy.life_value - self.aggr
    12 # egon = Person('egon',1000,50)
    13 # alex = Person('alex',250,5)
    14 # print(alex.life_value)
    15 # egon.attack(alex)
    16 # egon.attack(alex)        #egon攻击alex,alex血会减少,相当于改了实例里面的value
    17 # print(alex.life_value)
    18 # alex.attack(egon)        #alex攻击egon,egon血量会减少

    四,面向对象人狗大战

     1 #!/usr/bin/env python
     2 #_*_coding;utf-8_*_
     3 
     4 class Person:
     5     role = '中国人'    #属性—— 静态属性
     6     def __init__(self,name,life_value,aggr):
     7         self.name = name
     8         self.life_value = life_value
     9         self.aggr = aggr
    10     def attack(self,dog):  #方法——动态属性,enemy对象,攻击谁
    11         dog.life_value = dog.life_value - self.aggr
    12 
    13 class Dog:
    14     def __init__(self,name,breed,aggr,life_value):
    15         self.nickname = name
    16         self.breed = breed
    17         self.aggr = aggr
    18         self.life_value = life_value
    19     def bite(self,person):
    20         person.life_value = person.life_value - self.aggr
    21 
    22 alex = Person('alex',250,500)
    23 egon = Person('egon',22,10)
    24 dahei = Dog('dahei','',30,2000)
    25 
    26 print(dahei.life_value)   #alex攻击dog,要打印狗的血
    27 alex.attack(dahei)
    28 print(dahei.life_value)
    29 
    30 print(alex.life_value)    #dog攻击alex,要打印alex的血
    31 dahei.bite(alex)
    32 print(alex.life_value)
    33 
    34 print(dahei.life_value)   #egon攻击dog,要打印狗的血
    35 egon.attack(dahei)
    36 print(dahei.life_value)

    五,人狗大战,人民币版本

     1 #!/usr/bin/env python
     2 #_*_coding;utf-8_*_
     3 
     4 #人狗大战,人民币版本
     5 class Person:
     6     '''
     7     这是一个游戏里人物的数据类型
     8     '''
     9     role = '中国人'    #类属性—— 静态属性
    10     def __init__(self,name,life_value,aggr):
    11         self.name = name #名字    #对象属性
    12         self.life_value = life_value #生命值 对象属性
    13         self.aggr = aggr #攻击力 对象属性
    14     def attack(self,enemy):  #攻击方法——动态属性
    15         enemy.life_value = enemy.life_value - self.aggr
    16 
    17 class Dog:
    18     def __init__(self,name,breed,aggr,life_value):
    19         self.nickname = name #昵称
    20         self.breed = breed   #品种
    21         self.aggr = aggr     #攻击力
    22         self.life_value = life_value  #生命值
    23     def bite(self,person):  #
    24         person.life_value = person.life_value - self.aggr
    25 egon = Person('egon',1000,50)
    26 dahei = Dog('dahei','',30,20000)
    27 egon.money = 200    #加入新的属性,也可以重写对象属性,这里因为是实例化后加入
    28 print(egon.money)
    29 
    30 class Weapon:  #武器类
    31     def __init__(self,name,aggr,life_value,price,attack_force):
    32         self.price = price
    33         self.name = name
    34         self.aggr = aggr   #伤害加成
    35         self.life_value = life_value #生命加成
    36         self.attack_force = attack_force #攻击力
    37     def update(self,person):  #带装备,人
    38         person.money = person.money - self.price
    39         person.aggr = person.aggr + self.aggr
    40         person.life_value = person.life_value + self.life_value
    41     def kill(self,obj):  #装备:主动技能
    42         obj.life_value = obj.life_value - self.attack_force
    43 r = Weapon('sword_soul',50,250,199,10000)
    44 
    45 if egon.money > r.price:
    46     r.update(egon)     #给egon装备上武器,相当于方法,然后有些对象属性增加,但是不会拥有所有属性
    47     egon.weapon = r    #所有的属性方法你都可以调用了
    48 
    49 # print(dahei.life_value)
    50 # print(egon.aggr)
    51 # egon.attack(dahei)
    52 # print(dahei.life_value)
    53 
    54 # egon.weapon.kill(dahei)   #调用武器的技能
    55 # print(dahei.life_value)
    56 # egon.weapon.kill(dahei)
    57 # print(dahei.life_value)

    六,命名空间问题

     1 #!/usr/bin/env python
     2 #_*_coding;utf-8_*_
     3 
     4 # 命名空间
     5 # 属性(类属性,静态属性),引用都是一样的,id一样
     6 print(id(egon.role))     #可以共享
     7 print(id(alex.role))
     8 print(id(Person.role))
     9 
    10 # 方法(动态属性)
    11 print(egon.name)
    12 print(alex.name)
    13 print(egon.attack)
    14 print(alex.attack)
    15 print(Person.attack)
    16 
    17 # 对象改变属性(静态属性,类属性)  对象修改属性是把属性拿下来之后改的,只对自己的米命名空间起作用
    18 egon.role = '印度人'
    19 print(egon.role,id(egon.role))
    20 print(alex.role,id(alex.role))
    21 print(Person.role,id(Person.role))
    22 # 如果属性改变,那就是都改变了
    23 Person.role = '印度人'
    24 print(alex.role)
    25 print(egon.role)

    七,总结

     1 #!/usr/bin/env python
     2 #_*_coding;utf-8_*_
     3 
     4 class 类名:
     5     类属性 = None
     6     def __init__(self,对象属性):
     7         self.对象属性 = 对象属性
     8     def 方法名(self):
     9         pass
    10 实例 = 类名(10)
    11 实例.方法名()
    12 # #类名
    13 # 类名.类属性
    14 # 类名.方法名
    15 
    16 # 实例 = 类名(参数,参数)  #实例就是对象
    17 
    18 # #实例
    19 # 实例.方法名()
    20 # 实例.对象属性
    21 
    22 # #实例增加属性
    23 # 实例.新的属性名 = 1000
    24 # print(实例.新的属性名)
    25 
    26 #dir(类) #返回类中的所有名字列表
    27 #isinstance(对象,类) #判断对象是否为类的实例
    28 # print(Person.__doc__)  打印类的注释消息
    29 # print(Person.__dict__) # 返回一个字典 key是属性名,value是属性值
    30 # print(Person.__module__)  #person类所在的模块
    31 # print(Person.__name__,type(Person.__name__)) #字符串数据类型的类名
    32 # from collections import namedtuple
    33 # p = namedtuple('Point',['x','y'])
    34 # p1 = p(1,2)
    35 # print(p.__name__)
  • 相关阅读:
    一点一点学写Makefile(3)-增加第三方库和头文件
    一点一点学写Makefile(2)-自动搜所当前目录下的所有源文件
    一点一点学写Makefile-1
    linux下使用libxml2实现对xml文件的读取及查询
    struts2 谷歌浏览器保存date类型数据时报错
    复习
    day31
    day30
    作业29
    day29
  • 原文地址:https://www.cnblogs.com/jokerbj/p/7350498.html
Copyright © 2011-2022 走看看