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. atomic详解

    http://www.360doc.com/content/14/1120/21/203028_426770242.shtml

  2. k8s网络之设计与实现

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 K8s网络设计与实现是在学习k8s网络过程中总结的内容.在学习k8s网络各种插件 ...

  3. 079、监控利器 sysdig (2019-04-26 周五)

    参考https://www.cnblogs.com/CloudMan6/p/7646995.html   sysdig 是一个轻量级的系统监控工具,同时他还原生支持容器.通过sysdig我们可以近距离 ...

  4. unet 网络接受任意大小的输入

    将网络的输入定义的placeholder 大小设为:[None,None,c], 不设置固定的大小. 但是出现问题: 前层特征图与后层特征图进行组合时,尺寸大小不一致: [32, 60, 256] 和 ...

  5. django在windows下的经历

    django-admin.py startproject project_name 去掉.py 常见命令:https://blog.csdn.net/weixin_42134789/article/d ...

  6. Spring框架-AOP详细学习[转载]

    参考博客:https://blog.csdn.net/qq_22583741/article/details/79589910#4-%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85% ...

  7. stylus 实践

    音乐分享: Broken Back - <Halcyon Birds> —————————————————————————————————————————————————————————— ...

  8. jenkins主要目录用途

    主目录 除了Jenkins的WAR包所在目录,Jenkins还有一个更重要的目录——Jenkins的所有重要数据都存放在这个独立的目录中,称为Jenkins主目录,它的默认位置是在当前用户根目录的隐藏 ...

  9. NB群友

    链接:https://ac.nowcoder.com/acm/contest/625/A来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言26214 ...

  10. 使用Open Live Write发布CSDN博客

    ---安装open live write 1.序 在CSDN上发布博客相当麻烦,图片一张张的上传确实让人头大,虽然通过office也能发布博客,不过Open Live Write软件使用感觉更好. 2 ...