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. 面向 ...
随机推荐
- Cucumber语法格式
@login Feature: Login @T1 Scenario: Login with correct credentail Given I open login page When I ent ...
- Java基础知识拾遗(三)
集合框架 SortedSet接口,声明了以升序进行排序的行为. Queue接口,声明了队列行为,队列通常是先进先出的列表 Deque接口,扩展了Queue接口,声明了双端队列的行为.双端队列可以像标准 ...
- <HTML> 模块
一些元素 <q>元素 用于引用, quote 浏览器一般会负责加上双引号,但是不是所有的浏览器都会在<q>元素的内容两边加双引号. <blockquote>元素 用 ...
- 谈谈JAVA中的安全发布
谈谈JAVA中的安全发布 昨天看到一篇文章阐述技术类资料的"等级",看完之后很有共鸣.再加上最近在工作中越发觉得线程安全性的重要性和难以捉摸,又掏出了<Java并发编程实战& ...
- 【bzoj 3495】PA2010 Riddle
Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n&l ...
- redhat7.4切换yum源为免费源
1.redhat是Linux系统中付费的企业版,虽然安装什么是免费的,但是需要注册. 如果你有注册码,暂请出门左拐(我没有注册码,所以我也不会注册,不用往下看了). Linux系统收费版:RedHat ...
- 20175204 张湲祯 2018-2019-2《Java程序设计》2
20175204 张湲祯 2018-2019-2<Java程序设计>2 必做课下作业MyCP 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP ...
- Decode String
Given an encoded string, return it's decoded string.The encoding rule is: k[encoded_string], where t ...
- 通过hook实现禁止shift+delete快捷键
实现全局hook必须要将hook代码封装在dll里,所以此程序有两个文件:noShiftDeleteHook.dll和noShiftDelete.exe noShiftDeleteHook.dll / ...
- Cardinality
Cardinality: 优化器在计算成本的时候,需要从统计信息中取得数据,然后去估计每一步操作所涉及的行数,叫做Cardinality. 比如,一张表T有1000行数据,列COL1上没有直方图,没有 ...