1.面向对象引入                  

先来创建一个小游戏:人狗大战

# 定义一个狗
def Gog(name,blood,aggr,kind):
dog = {
'name':name,
'blood':blood,
'aggr':aggr,
'kind':kind
}
return dog # 定义一个人
def Person(name,blood,aggr,kind):
person ={
'name':name,
'blood':blood,
'aggr':aggr,
'kind':kind
}
return person # 定义一个人的技能 打
def attack(person,dog):
dog['blood'] -= person['aggr']
print('{}被打了,掉了{}的血'.format(dog['name'],person['aggr'])) # 定义一个狗的技能 咬
def bite(dog,person):
person['blood'] -= dog['aggr']
print('{}被咬了,掉了{}的血'.format(person['name'],dog['aggr'])) yellow = Gog('dahuang',1000,100,'jinmao')
alex = Person('alex',800,50,'战士') bite(yellow,alex)
# "alex被咬了,掉了100的血"
bite(alex,yellow)
# "dahuang被咬了,掉了50的血" 这里就出现了一些问题,狗咬狗

以上方法会出现 “人咬狗”的错误。衍生了人狗大战第二版

# 定义一个狗
def Gog(name,blood,aggr,kind):
dog = {
'name':name,
'blood':blood,
'aggr':aggr,
'kind':kind
}
def bite(person):
person['blood'] -= dog['aggr']
print('{}被咬了,掉了{}的血'.format(person['name'], dog['aggr']))
dog['bite'] = bite # 将狗的技能作为一个字典参数加进来
return dog # 定义一个人
def Person(name,blood,aggr,kind):
person ={
'name':name,
'blood':blood,
'aggr':aggr,
'kind':kind
}
def attack(dog):
dog['blood'] -= person['aggr']
print('{}被打了,掉了{}的血'.format(dog['name'], person['aggr']))
person['attack'] = attack # 将人的打技能作为字典参数传进来
return person yellow = Gog('dahuang',1000,100,'jinmao')
alex = Person('alex',800,50,'战士') print(yellow) # 在狗,大黄内自带一个函数,需要传参:被咬的人
# {'name': 'dahuang', ...'bite': <function Gog.<locals>.bite at 0x0000027FAED2ABF8>}
yellow['bite'](alex)
# 给大黄的咬的技能函数加入一个参数人,一样可以得到结果
# alex被咬了,掉了100的血

2.面向对象编程理解                

  1. 所谓模子 就是类 抽象的,例如上面的函数人。例如人类
  2. 但是根据 模子刻出来的就是对象,例如 根据狗刻出来的yellow(大黄)。人类中的科比,姚明为对象
  3. 先有类再有对象

3.面向对象初识                   

# 自定义类
class Person: # 类名
country = 'China' # 创建一个类属性(静态属性), def __init__(self,*args): # self 类似于一个可以存储很多属性的字典 (初始化方法,self是必须传参数)
# print(self.__dict__) # 此处可看到self是一个空字典
self.name = args[0] # name,hp,aggr,sex类似于在字典里放置属性
self.hp = args[1]
self.aggr = args[2]
self.sex = args[3]
print(self.__dict__) # 此处可看到字典多了key,value
# print(id(self)) # 内存地址与 'alex' 内存地址一样
def work(self,n): # self 是一个必要的任意参数,一般叫self。 (函数写在类中叫方法,一般必须传第一个self参数,后面其他参数)
print('{}走走走,走了{}步'.format(self.name,n)) alex = Person('二狗子',100,50,'男') #alex对象 实例化。 执行类 + 括号就是在调用__init__(self)方法
print(alex.__dict__) # 此处
# print(id(alex))
Person.work(alex,5) # 调用方法 类名.方法名(对象名)
alex.work(10) # 等价于 Person.work(alex)
print(Person.country) alex.__dict__['name'] = '中华田园犬'
print(alex.name)
alex.name = '土狗'
print(alex.__dict__['name']) # alex.name == alex.__dict__['name'] 增删 # 类的属性是不可以进行修改的
# 对象可以做的事:
# 1.查看属性(alex.name),
# 2.调用方法(alex.work())
# 3.对于对象的增删改查可以通过__dict__方法进行或者 对象.属性 # 类名可以做的事:
# 1.实例化对象
# 2.调用方法,需要自己传递self参数
# 3.调用类属性,静态属性
# 4.__dict__对于类中的属性等只能看不能操作
####################
{'name': '二狗子', 'hp': 100, 'aggr': 50, 'sex': '男'}
{'name': '二狗子', 'hp': 100, 'aggr': 50, 'sex': '男'}
二狗子走走走,走了5步
二狗子走走走,走了10步
China
中华田园犬
土狗

4.面向对象练习             

4.1 人狗大战面向对象版

class Dog:
def __init__(self,name,blood,aggr,kind):
self.na = name
self.hp = blood
self.gong = aggr
self.kin = kind
def bite(self,person):
# 狗咬人,人掉血
person.hp -= self.gong
if person.hp <= 0:
print('{}咬了{},{}被咬死了'.format(self.na,person.na,person.na))
else:
print('{}咬了{},掉了{}血'.format(self.na,person.na,self.gong)) class Person:
def __init__(self,name,blood,aggr,sex):
self.na = name
self.hp = blood
self.gong = aggr
self.se = sex
def attrck(self,ddog):
# 人打狗,狗掉血
ddog.hp -= self.gong
if ddog.hp <= 0:
print('{}打了{},{}被打死了'.format(self.na,ddog.na,ddog.na))
else:
print('{}打了{},掉了{}血'.format(self.na,ddog.na,self.gong)) dijia = Person('奥特曼',500,50,'man')
yellow_dog = Dog('大黄',300,20,'teddy') yellow_dog.bite(dijia)
dijia.attrck(yellow_dog)

"""
大黄咬了奥特曼,掉了20血
奥特曼打了大黄,掉了50血

4.2 圆的面积和周长

class circle:
def __init__(self,banjin):
self.bj = banjin
def zhouchang(self):
return self.bj * 2 * 3.14
def mianji(self):
return self.bj ** 2 * 3.14 ab = circle(2)
print(ab.zhouchang())
print(ab.mianji())

小结:

  1. 当有几个函数需要反复传入相同参数的时候,可以考虑使用面向对象
  2. 非常明显的处理一类事物,这些食物具有相同的属性和功能
  3. 参数都是对象的属性

               

day22.面向对象初识的更多相关文章

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

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

  2. python之面向对象初识

    一.面向对象初识 1.结构上 面向对象分成两部分:属性.方法 class A: name = 'xiaoming' # 静态属性.静态变量.静态字段. def func1(self): # 函数.动态 ...

  3. python基础(17)继承类和面向对象初识

    1.继承类 class Lm: money = 1000000 house = 5 def driver(self): print('会开车') class Mcb(Lm): def about_me ...

  4. day06_雷神_面向对象初识

    day_06 递归函数 自己用自己.一般递归100多次,都没有解决的问题,放弃递归. count = 0 def func1(): global count count += 1 print(coun ...

  5. 《Python》 面向对象初识

    一.面向对象初识: 1.结构上理解:类由两部分组成 class  A: # class是类的关键字,类名首字母默认大写 name = 'alex' # 静态属性,静态变量,静态字段 def  func ...

  6. python递归 及 面向对象初识及编程思想

    递归 及 面向对象初识及编程思想   一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递 ...

  7. python基础学习笔记——面向对象初识

    面向对象初识 python中一切皆对象. 类有两种: 新式类:在py3中所有类都是新式类 经典类:在py2中只有类本身继承了object类才叫做新式类,默认是经典类 class Person: cou ...

  8. Python中面向对象初识到进阶

    面向对象初识到进阶 # 面向对象结构: # class 类名: # def __init__(self,参数1,参数2): # self.对象的属性1 = 参数1 # self.对象的属性2 = 参数 ...

  9. Python面向对象01 /面向对象初识、面向对象结构、类、self、实例化对象

    Python面向对象01 /面向对象初识.面向对象结构.类.self.实例化对象 目录 Python面向对象01 /面向对象初识.面向对象结构.类.self.实例化对象 1. 面向对象初识 2. 面向 ...

随机推荐

  1. Vue(小案例_vue+axios仿手机app)_购物车(二模拟淘宝购物车页面,点击加减做出相应变化)

    一.前言 在上篇购物车中,如果用户刷新了当前的页面,底部导航中的数据又会恢复为原来的: 1.解决刷新,购物车上数值不变                                         ...

  2. 03--STL序列容器(Deque)

    一:Deque双端队列<头尾操作> stack和queue是在Deque的基础上改进的,所以先介绍双端队列Deque     deque是“double-ended queue”的缩写,和 ...

  3. hadoop记录-hadoop常用

    1.hdfs目录配额 #设置配额目录hdfs dfsadmin -setSpaceQuota 10T /user/hive/warehouser/tmp查看配额目录信息hdfs dfs -count ...

  4. Oracle ORA-08104报错处理方法及注意事项

    [环境介绍] 系统环境:IBM P740 8205-E6C (AIX) + 11.2.0.3.0 Oracle RAC [背景介绍] 故障描述:数据库表空间超过90%,无法进行扩容表空间,需要业务侧清 ...

  5. C# 类型转换的开销

    先来个测试: static void Main(string[] args) { Stopwatch stopwatch; string strStr = "string"; ob ...

  6. VS注释快捷键

    注释:        先CTRL+K,然后CTRL+C 取消注释: 先CTRL+K,然后CTRL+U 代码自动对齐:1, ctrl+a 2, ctrl+k 3, ctrl+f

  7. 网络结构---从alexnet 到resnet

    AlexNet-> vgg vgg 采用更小的卷积核,加深网络深度,但两者的共同点都是卷积层+pooling层最后接上fc 层的结构 Network in network ->google ...

  8. java使用redis数据库

    1.安装 Redis 支持 32 位和 64 位,根据实际情况选择不同的安装版本. 安装完成后打开命令提示窗口,切换到redis安装目录,启动redis客户端, redis-cli命令启动redis客 ...

  9. 「luogu2387」[NOI2014] 魔法森林

    「luogu2387」[NOI2014] 魔法森林 题目大意 \(n\) 个点 \(m\) 条边的无向图,每条边上有两个权值 \(a,b\),求从 \(1\) 节点到 \(n\) 节点 \(max\{ ...

  10. jquery.form插件 提交表单 type="hidden"取不到值的问题记录

    1.外国文献:说可以改成其他的(非hidden),再加style="display:none"隐藏. <INPUT type="password" sty ...