day22.面向对象初识
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.面向对象编程理解
- 所谓模子 就是类 抽象的,例如上面的函数人。例如人类
- 但是根据 模子刻出来的就是对象,例如 根据狗刻出来的yellow(大黄)。人类中的科比,姚明为对象
- 先有类再有对象
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())
小结:
- 当有几个函数需要反复传入相同参数的时候,可以考虑使用面向对象
- 非常明显的处理一类事物,这些食物具有相同的属性和功能
- 参数都是对象的属性
day22.面向对象初识的更多相关文章
- day22 01 初识面向对象----简单的人狗大战小游戏
day22 01 初识面向对象----简单的人狗大战小游戏 假设有一个简单的小游戏:人狗大战 怎样用代码去实现呢? 首先得有任何狗这两个角色,并且每个角色都有他们自己的一些属性,比如任务名字nam ...
- python之面向对象初识
一.面向对象初识 1.结构上 面向对象分成两部分:属性.方法 class A: name = 'xiaoming' # 静态属性.静态变量.静态字段. def func1(self): # 函数.动态 ...
- python基础(17)继承类和面向对象初识
1.继承类 class Lm: money = 1000000 house = 5 def driver(self): print('会开车') class Mcb(Lm): def about_me ...
- day06_雷神_面向对象初识
day_06 递归函数 自己用自己.一般递归100多次,都没有解决的问题,放弃递归. count = 0 def func1(): global count count += 1 print(coun ...
- 《Python》 面向对象初识
一.面向对象初识: 1.结构上理解:类由两部分组成 class A: # class是类的关键字,类名首字母默认大写 name = 'alex' # 静态属性,静态变量,静态字段 def func ...
- python递归 及 面向对象初识及编程思想
递归 及 面向对象初识及编程思想 一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递 ...
- python基础学习笔记——面向对象初识
面向对象初识 python中一切皆对象. 类有两种: 新式类:在py3中所有类都是新式类 经典类:在py2中只有类本身继承了object类才叫做新式类,默认是经典类 class Person: cou ...
- Python中面向对象初识到进阶
面向对象初识到进阶 # 面向对象结构: # class 类名: # def __init__(self,参数1,参数2): # self.对象的属性1 = 参数1 # self.对象的属性2 = 参数 ...
- Python面向对象01 /面向对象初识、面向对象结构、类、self、实例化对象
Python面向对象01 /面向对象初识.面向对象结构.类.self.实例化对象 目录 Python面向对象01 /面向对象初识.面向对象结构.类.self.实例化对象 1. 面向对象初识 2. 面向 ...
随机推荐
- 《STL源码剖析》----2.23 value_type()和__type_traits<>如何实现
在2.13小节destory()第二版本接受两个迭代器找出元素类型,代码如下 其中value_type()判断出类型,__type_traits判断是否存在trivial destructor 在3. ...
- css中自定义字体
css代码如下: @font-face { font-family: 'HelveticaNeueLTPro-Th'; src: url('../fonts/HelveticaNeueLTPro-Th ...
- day16,模块 , 用户管理系统 , 购物车程序 , 分页显示.
#!/usr/bin/env python# -*- coding:utf-8 -*- # 1.列举你常见的内置函数."""强制转换:int() / str() / li ...
- 一次 ElasticSearch 搜索优化
一次 ElasticSearch 搜索优化 1. 环境 ES6.3.2,索引名称 user_v1,5个主分片,每个分片一个副本.分片基本都在11GB左右,GET _cat/shards/user 一共 ...
- 树莓派3B+ 安装系统
安装概要步骤: 官网下载系统->刷入TF卡->设置开启显示器和SSH->通电->进入系统 1. 进入官方网站下载系统镜像 下载页面:https://www.raspberryp ...
- es6中的class的使用
---恢复内容开始--- es5中生成实例对象的传统方法是通过构造函数: function Point(x,y){ this.x = x; this.y = y; } Point.prototype. ...
- centos 7.2下搭建vsftp 虚拟用户
虚拟用户搭建vsftp 要求一: 只允许上传 下载 不能删除 不能更换名称 yum install pam* yum install db4* -y yum install vsftpd chkcon ...
- hibernate之一对多,多对一
配置文件 <!--一对多--><!--name:集合属性名字 column:外键列名 class:与它相关的对象的完整列名 cascade:级联操作:分3种 save-update: ...
- 【题解】狼抓兔子—BZOJ1001。
(胡扯时间)今天炒鸡无聊就打算BZOJ开始从第一道题开始顺着打,这样未来一段时间内也就有事干了.结果发现A+B切掉后就遭遇了一个"小小"的瓶颈(真不友好. 好了说题说题.看题第一眼 ...
- Leetcode-1.两数之和
题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...