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

 #!/usr/bin/env python
#_*_coding:utf-8_*_ #1.函数 人模子
def person(name,level,life_value):
p_dic = {
'name':name,
'level':level,
'life_value':life_value
}
return p_dic
joker = person('joker',100,4000) #函数 狗模子
def dog(name,breed,live_value):
d_dic = {
'name': name,
'breed': breed, #(品种)
'live_value': live_value
}
return d_dic
dahei = dog('dahei','狼',10000) #函数 定义人的攻击
def attack(person): #定义人攻击
print('%s在攻击'%person['name'])
attack(joker) #将Joker的返回值的字典传入,获取字典相应的值 #函数 定义狗的攻击
def bite(dog): #定义狗攻击
print('%s在咬'%dog['name'])
bite(dahei) #将dahei的返回值的字典传入,获取字典相应的值

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

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

二,通过嵌套函数去写

 #!/usr/bin/env python
#_*_coding:utf-8_*_ def person(name,level,life_value):
def attack(): #把这个攻击定义在人里面
print('%s在攻击' %p_dic['name'])
p_dic = {
'name':name,
'level':level,
'life_value':life_value,
'attack':attack
}
return p_dic def dog(name,breed,live_value):
def bite(): #把这个攻击定义在狗里面
print('%s在咬' % d_dic['name'])
d_dic = {
'name':name,
'breed':breed,
'live_value':live_value,
'bite':bite
}
return d_dic joker = person('joker',100,4000)
dahei = dog('dahei','狼',10000)
joker['attack']() #这样调用的话就没有问题了,字典方式调用
dahei['bite']()

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

三,面向对象的定义

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

3.1 上面代码解释成函数为

 #!/usr/bin/env python
#_*_coding;utf-8_*_ def Person(*args,**kwargs):
self = {}
def __init__(name,life_value,aggr):
self['name'] = name
self['life_value'] = life_value
self['aggr'] = aggr
return self
self_ret = __init__(*args,**kwargs)
return self_ret
# joker =Person('joker',1000,500)

3.2 人人大战

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

四,面向对象人狗大战

 #!/usr/bin/env python
#_*_coding;utf-8_*_ class Person:
role = '中国人' #属性—— 静态属性
def __init__(self,name,life_value,aggr):
self.name = name
self.life_value = life_value
self.aggr = aggr
def attack(self,dog): #方法——动态属性,enemy对象,攻击谁
dog.life_value = dog.life_value - self.aggr class Dog:
def __init__(self,name,breed,aggr,life_value):
self.nickname = name
self.breed = breed
self.aggr = aggr
self.life_value = life_value
def bite(self,person):
person.life_value = person.life_value - self.aggr alex = Person('alex',250,500)
egon = Person('egon',22,10)
dahei = Dog('dahei','狼',30,2000) print(dahei.life_value) #alex攻击dog,要打印狗的血
alex.attack(dahei)
print(dahei.life_value) print(alex.life_value) #dog攻击alex,要打印alex的血
dahei.bite(alex)
print(alex.life_value) print(dahei.life_value) #egon攻击dog,要打印狗的血
egon.attack(dahei)
print(dahei.life_value)

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

 #!/usr/bin/env python
#_*_coding;utf-8_*_ #人狗大战,人民币版本
class Person:
'''
这是一个游戏里人物的数据类型
'''
role = '中国人' #类属性—— 静态属性
def __init__(self,name,life_value,aggr):
self.name = name #名字 #对象属性
self.life_value = life_value #生命值 对象属性
self.aggr = aggr #攻击力 对象属性
def attack(self,enemy): #攻击方法——动态属性
enemy.life_value = enemy.life_value - self.aggr class Dog:
def __init__(self,name,breed,aggr,life_value):
self.nickname = name #昵称
self.breed = breed #品种
self.aggr = aggr #攻击力
self.life_value = life_value #生命值
def bite(self,person): #咬
person.life_value = person.life_value - self.aggr
egon = Person('egon',1000,50)
dahei = Dog('dahei','狼',30,20000)
egon.money = 200 #加入新的属性,也可以重写对象属性,这里因为是实例化后加入
print(egon.money) class Weapon: #武器类
def __init__(self,name,aggr,life_value,price,attack_force):
self.price = price
self.name = name
self.aggr = aggr #伤害加成
self.life_value = life_value #生命加成
self.attack_force = attack_force #攻击力
def update(self,person): #带装备,人
person.money = person.money - self.price
person.aggr = person.aggr + self.aggr
person.life_value = person.life_value + self.life_value
def kill(self,obj): #装备:主动技能
obj.life_value = obj.life_value - self.attack_force
r = Weapon('sword_soul',50,250,199,10000) if egon.money > r.price:
r.update(egon) #给egon装备上武器,相当于方法,然后有些对象属性增加,但是不会拥有所有属性
egon.weapon = r #所有的属性方法你都可以调用了 # print(dahei.life_value)
# print(egon.aggr)
# egon.attack(dahei)
# print(dahei.life_value) # egon.weapon.kill(dahei) #调用武器的技能
# print(dahei.life_value)
# egon.weapon.kill(dahei)
# print(dahei.life_value)

六,命名空间问题

 #!/usr/bin/env python
#_*_coding;utf-8_*_ # 命名空间
# 属性(类属性,静态属性),引用都是一样的,id一样
print(id(egon.role)) #可以共享
print(id(alex.role))
print(id(Person.role)) # 方法(动态属性)
print(egon.name)
print(alex.name)
print(egon.attack)
print(alex.attack)
print(Person.attack) # 对象改变属性(静态属性,类属性) 对象修改属性是把属性拿下来之后改的,只对自己的米命名空间起作用
egon.role = '印度人'
print(egon.role,id(egon.role))
print(alex.role,id(alex.role))
print(Person.role,id(Person.role))
# 如果属性改变,那就是都改变了
Person.role = '印度人'
print(alex.role)
print(egon.role)

七,总结

 #!/usr/bin/env python
#_*_coding;utf-8_*_ class 类名:
类属性 = None
def __init__(self,对象属性):
self.对象属性 = 对象属性
def 方法名(self):
pass
实例 = 类名(10)
实例.方法名()
# #类名
# 类名.类属性
# 类名.方法名 # 实例 = 类名(参数,参数) #实例就是对象 # #实例
# 实例.方法名()
# 实例.对象属性 # #实例增加属性
# 实例.新的属性名 = 1000
# print(实例.新的属性名) #dir(类) #返回类中的所有名字列表
#isinstance(对象,类) #判断对象是否为类的实例
# print(Person.__doc__) 打印类的注释消息
# print(Person.__dict__) # 返回一个字典 key是属性名,value是属性值
# print(Person.__module__) #person类所在的模块
# print(Person.__name__,type(Person.__name__)) #字符串数据类型的类名
# from collections import namedtuple
# p = namedtuple('Point',['x','y'])
# p1 = p(1,2)
# print(p.__name__)

python开发面向对象基础:人狗大战学面向对象的更多相关文章

  1. day24 python学习 类 画元,命名空间作用域,组合,人狗大战升级

    类命名空间与对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就 ...

  2. day22 01 初识面向对象----简单的人狗大战小游戏

    day22 01 初识面向对象----简单的人狗大战小游戏 假设有一个简单的小游戏:人狗大战   怎样用代码去实现呢? 首先得有任何狗这两个角色,并且每个角色都有他们自己的一些属性,比如任务名字nam ...

  3. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  4. day23 02 组合(继续人狗大战游戏)

    day23 02 组合(继续人狗大战游戏) 面向对象的三大特性:继承 多态 封装 先讲解一下组合 组合:一个对象的属性值是另一个类的对象:对象.属性.属性(一般有两个点) 继续扩展day22 01里面 ...

  5. Python开发【第七篇】:面向对象 和 python面向对象(初级篇)(上)

    Python 面向对象(初级篇)   51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...

  6. Python开发【第七篇】:面向对象

    Python之路[第五篇]:面向对象及相关   面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ...

  7. Python开发——1.基础知识

    一.开发 开发语言分为高级语言和低级语言 高级语言:Python.Java.PHP.C++.C#.GO.Ruby等:低级语言:C.汇编语言. 高级语言对应的是字节码,是将代码编译成字节码,然后交给机器 ...

  8. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

  9. day23 python学习 类 人狗大战

    面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 面向过程 优点是:极大的降低了 ...

随机推荐

  1. BZOJ 1492 [NOI2007]货币兑换Cash:斜率优化dp + cdq分治

    传送门 题意 初始时你有 $ s $ 元,接下来有 $ n $ 天. 在第 $ i $ 天,A券的价值为 $ A[i] $ ,B券的价值为 $ B[i] $ . 在第 $ i $ 天,你可以进行两种操 ...

  2. Angular 2 Architecture Overview

    Module 简单来说模块(module)就是完成共同目的的代码块,export一些内容例如一个类.函数.或值变量. component就是一个基本的Angular块,一个component类其实也是 ...

  3. Selenium with Python 005 - 调用js操作页面元素

    WebDriver提供了execute_script()方法来执行JavaScript方法,格式如 driver.execute_script(script,*args) 执行js一般有两种场景,一是 ...

  4. Ajax-04 jQuery Ajax 常用操作

    jQuery jQuery 其实就是一个JavaScript的类库,其将复杂的功能做了上层封装,使得开发者可以在其基础上写更少的代码实现更多的功能. jQuery Ajax a.概述 jQuery 不 ...

  5. SpringBoot下的Dubbo和Zookeeper整合

    最近一直在学各种分布式的内容,学到了dubbo分布式服务框架就想写个小demo使用一下,但是由于我要整合在SpringBoot框架中,SpringBoot框架毕竟提倡的是java注解配置,XML文件不 ...

  6. C#外部类、内部类(嵌套类)之间的成员访问特点

    最近程序中需要用到多线程工作下的单例模式.而其多种实现方法中,利用内部类实现懒汉模式是一种值得推荐的方式.顺便也就对内部类和外部类之间的关系做了一下研究,总结如下(理解不困难,不粘贴代码了,有需要的留 ...

  7. Nginx 常用配置模板

    user root root; worker_processes auto; worker_rlimit_nofile 51200; events { use epoll; worker_connec ...

  8. LeetCode OJ:First Missing Positive (第一个丢失的正数)

    在leetCode上做的第一个难度是hard的题,题目如下: Given an unsorted integer array, find the first missing positive inte ...

  9. 条款22:将成员变量声明为private

    protected成员变量的封装性并非高于public变量. 如果有个public的成员变量,一旦其需要改变,那么所有使用它的代码都需要改变. 如果有个protected的成员变量,一点其需要改变,那 ...

  10. Unity中使用柏林噪声生成地图

    孙广东  2017.3.27 http://blog.csdn.NET/u010019717 主要是利用Unity的 Mathf.PerlinNoise   函数(柏林噪声)的不同寻常的功能. htt ...