目录
面向对象编程:oop [object oriented programming] 是一种python的编程思路
面向过程:就是我们一开始学习的,按照解决问题的步骤去写代码 【根据业务逻辑去写代码】
在思考问题的时候, 首先分析'怎么按照步骤去实现' 然后将问题解决拆解成若干个步骤,并将这些步骤对应成方法一步一步的 最终完成功能
面向对象:关注的是设计思维【找洗车店 给钱洗车】
出差--北京
小明-- 什么时间 - -买什么票【高铁 汽车 飞机】---酒店---回程时间
亲力亲为的去做 【面向过程】
面向过程不足:小明没有更多的精力去考虑别的事情
boss--- 秘书【小明需要考虑的事情】----财务----目的:北京 【面向对象】
boss有更多的精力去处理其他的时候,创造更多的价值
从计算机的角度来看:面向过程不适合做大项目
而面向对象合适做更大项目的设计
类和对象
类:类是具有一组 相同或者相似特征【属性】和行为【方法】的一系列[多个]对象组合
现实世界 计算机世界
行为---------> 方法
特征---------->属性
对象: 对象是实实在在的一个东西,类的实例化,具象化
类是对象的抽象化 而对象是类的一个实例
实例方法:在类的内部,使用def 关键字来定义 第一个参数默认是 self【名字标识可以是其他的名字,但是这个位置必须被占用】
实例方法是归于 类的实例所有
属性:类属性 实例属性
在类的内部定义的变量【类属性】
在方法内部定义的【通过类似于self.变量名】 变量,是实例属性
一、面向对象
面向过程的关注点是:怎么做
面向对象的关注点是:谁来做
二、类和对象
三、实例方法和属性
self只是一个关键字,可以换成其他的,他必须作为第一个参数在类中存在,才是实例方法,实例方法归实例所有,任何实例都可以调用,对象就是类的实例
# 定义类和对象
# 类结构 类名 属性 方法
# class 类名:
# 属性
# 方法
class Person:
'''
对应人的特征
'''
# name='小明' #类属性
age=20 #类属性
'''
对应人的行为 实例方法
'''
def __init__(self):
self.name='小明' #实例属性
pass
def eat(parms):
print("大口的吃饭")
pass
def run(self): #实例方法
print('飞快的跑')
pass
pass
def printInfo():
'''
普通方法
:return:
'''
pass
# 创建一个对象【类的实例化】
# 规则格式 对象名=类名()
xm=Person()
xm.eat() #调用函数
xm.run()
print("{}的年龄是:{}".format(xm.name,xm.age))
# 创建另外一个实例对象
xw=Person()
xw.eat() #实例方法
四、__init__方法
类属性方法不能修改值,实例属性可以
__init__也叫初始化方法
# class Pepole:
# def __init__(self):
# '''
# 实例属性的声明
# '''
# self.name='小倩'
# self.sex='女生'
# self.age=20
# pass
# def eat(self):
# '''
# 吃的行为
# :return:
# '''
# print('喜欢吃榴莲')
# pass
#
# xq=Pepole()
# xq.name='小倩' #添加实例属性
# xq.sex='女生' #添加实例属性
# xq.age=20 #添加实例属性
# xq.eat()
# # print(xq.name,xq.sex,xq.age)
#
# xl=Pepole() #创建出来的
# xl.name='小倩' #添加实例属性
# xl.sex='女生' #添加实例属性
# xl.age=20 #添加实例属性
#
# xm=Pepole() #在创建新对象的时候 是自动执行的
# print(xm.name) #直接输出的是默认值
# xm.name='小明'
# print(xm.name)
# 如果有n个这个对象 被实例化 那么就需要添加很多次这样的属性了 显然是比较麻烦
# init传递参数 改进
class Pepole:
def __init__(self,name,sex,age):
'''
实例属性的声明
'''
self.name=name
self.sex=sex
self.age=age
pass
def eat(self,food):
'''
吃的行为
:return:
'''
print(self.name+'喜欢吃'+food)
pass
zp=Pepole('张鹏','男生',18)
print(zp.name,zp.age)
zp.eat('香蕉')
lh=Pepole('李辉','男生',28)
lh.eat('苹果')
print(lh.name,lh.age)
xh=Pepole('小花','女生',20)
xh.eat('橘子')
print(xh.name,xh.age)
# 总结 __init__
# 1. python 自带的内置函数 具有特殊的函数 使用双下划线 包起来的【魔术方法】
# 2. 是一个初始化的方法 用来定义实例属性 和初始化数据的,在创建对象的时候自动调用 不用手动去调用
# 3. 利用传参的机制可以让我们定义功能更加强大并且方便的 类
五、self
六、魔法方法
(1)str方法
通常用来查看常用信息,没有str时直接打印实例对象出现地址,有str时出现他的return
(2)new方法
new比init先执行,实例化类,创建的实例对象的返回值给init的第一个参数,不写new会自动调用
class Person:
def __init__(self,pro,name,food):
'''
:param pro: 专业
:param name: 姓名
:param food: 食物
'''
self.pro=pro #实例属性的定义
self.name=name
self.food=food
print('----init-----函数执行')
pass
'''
定义类
'''
def eat(self,name,food):
'''
实例方法
:return:
'''
# print('self=%s',id(self))
print('%s 喜欢吃 %s 修的专业是:%s'%(self.name,self.food,self.pro))
pass
def __str__(self):
'''
打印对象 自定义对象 是内容格式的
:return:
'''
return '%s 喜欢吃 %s 修的专业是:%s'%(self.name,self.food,self.pro)
pass
def __new__(cls, *args, **kwargs):
'''
创建对象实例的方法 每调用一次 就会生成一个新的对象 cls 就是class的缩写
场景:可以控制创建对象的一些属性限定 经常用来做单例模式的时候来使用
:param args:
:param kwargs:
'''
print('----new-----函数的执行')
return object.__new__(cls) #在这里是真正创建对象实例的
pass
pass
# xw是一个新的实例化对象
xw=Person('心理学','小王','榴莲')
# print('xw=%s',id(xw))
# xw.eat('小王','榴莲')
print(xw) #直接输出对象
# 小结 self特点
# self只有在类中定义 实例方法的时候才有意义,在调用时候不必传入相应的参数 而是由解释器 自动去指向
# self的名字是可以更改的 可以定义成其他的名字,只是约定俗成的定义成了 self
# self 指的是 类实例对象本身, 相当于java中 this
# __new__和__init___函数的区别
# __new__ 类的实例化方法 必须要返回该实例 否则对象就创建不成功
# __init___ 用来做数据属性的初始化工作 也可以认为是实例的构造方法 接受类的实例 self 并对其进行构造
# __new__ 至少有一个参数是 cls 代表要实例化的类 ,此参数在实例化时由python解释器自动提供
# __new__ 函数 执行要早于 __init___ 函数
七、双人对决
# 决战紫禁之巅有两个人物,西门吹雪以及叶孤城
# 属性:
# name 玩家的名字
# blood 玩家血量
#
# 方法:
# tong() 捅对方一刀,对方掉血10滴
# kanren() 砍对方一刀,对方掉血15滴
# chiyao() 吃一颗药,补血10滴
# __str__ 打印玩家状态。
#
# 第一步 需要先去定义一个类【角色类】
import time # 导入时间的包
import random
class Role:
def __init__(self,name,hp):
'''
构造初始化函数
:param name: 角色名
:param hp: 血量
'''
self.name = name
self.hp = hp
pass
def tongyidao(self,enemy):
'''
捅人
:param enemy:敌人
:return:
'''
# 敌人掉10血
enemy.hp -= 10
info = '[%s]捅了[%s]一刀' %(self.name,enemy.name)
print(info)
pass
def kanyidao(self,enemy):
'''
砍人
:param enemy:敌人
:return:
'''
# 敌人掉15血
enemy.hp -= 15
info = '[%s]砍了[%s]一刀' %(self.name, enemy.name)
print(info)
pass
def chiyao(self):
'''
吃药
:return:
'''
self.hp += 10
info = '[%s]吃了一颗补血药,增加了10滴血' %(self.name)
print(info)
pass
def __str__(self):
return '%s 还剩下 %s 的血量' %(self.name, self.hp)
# 第二步 创建2个:西门吹雪、叶孤城 实例化对象
xmcx = Role('西门吹雪', 100)
ygc = Role('叶孤城', 100)
def xmcx_zhandou(go):
"""
xmcx所有可能发生的状况
:param go: 随机战斗的值
:return:
"""
if go == 1:
xmcx.tongyidao(ygc) # 西门吹雪捅了叶孤城一刀+
elif go == 2:
xmcx.kanyidao(ygc) # 西门吹雪看了叶孤城一刀
else:
xmcx.chiyao() # 西门吹雪吃药
pass
def ygc_zhandou(go):
"""
ygc所有可能发生的状况
:param go: 随机战斗的值
:return:
"""
if go == 1:
ygc.tongyidao(xmcx) # 叶孤城捅了西门吹雪一刀
elif go == 2:
ygc.kanyidao(xmcx) # 叶孤城看了西门吹雪一刀
else:
ygc.chiyao() # 叶孤城吃药
pass
# for i in range(1,10):
# go = random.randint(1,4)
# print(go)
i = 1 # 回合数
while 1:
xmcx_go = random.randint(1,3) # xmcx随机战斗状况
ygc_go = random.randint(1,3) # ygc随机战斗状况
xianshou = random.randint(1,2) # 随机先手
print('--------------------第 %d 回合----------------------' % i)
if xmcx.hp <= 0 or ygc.hp <= 0:
break
if xianshou == 1: # xmcx先手
xmcx_zhandou(xmcx_go)
ygc_zhandou(ygc_go)
else:
ygc_zhandou(ygc_go) # ygc先手
xmcx_zhandou(xmcx_go)
print(xmcx) # 打印对象状态
print(ygc) # 打印对象状态
time.sleep(2) # 延时1s
i += 1
pass
print('对战结束')
if xmcx.hp <= 0:
print('[叶孤城]获胜')
elif ygc.hp <= 0:
print('[西门吹雪]获胜')
# while True:
# if xmcx.hp <= 0 or ygc.hp <= 0:
# break
# xmcx.tongyidao(ygc) # 西门吹雪捅了叶孤城一刀
# print(ygc) # 打印对象状态
# print(xmcx)
# print('---------------------------------------------')
# ygc.tongyidao(xmcx)
# print(ygc) # 打印对象状态
# print(xmcx)
# print('---------------------------------------------')
# xmcx.chiyao()
# print(ygc) # 打印对象状态
# print(xmcx)
# print('---------------------------------------------')
# time.sleep(1) # 延时1s
# pass
#
# print('对战结束')
八、作业
# 1、python中如何通过类创建对象,请用代码举例说明。
class Student:
def run(self):
print('学生每天进行2000米的跑步训练')
pass
pass
xiaoli=Student() #创建一个对象
xiaoli.run()
# 2、如何在类中定义一个方法,请用代码举例说明。
# 参考上述demo
# 3、定义一个水果类,然后通过水果类,创建苹果对象、橘子对象、西瓜对象并分别添加上颜色属性
class SgClass:
def __init__(self,name,color):
'''
:param name:
:param color:
'''
self.color=color
self.name=name
pass
def __str__(self):
return '%s 的颜色是【%s】'%(self.name,self.color)
pass
pg=SgClass('苹果','红色')
pg.zj=10 #通过对象添加对象属性
print(pg)
print('*'*40)
jz=SgClass('橘子','橙色')
print(jz)
print('*'*40)
xg=SgClass('西瓜','黑皮')
print(xg)
# 4、请编写代码,验证self就是实例本身。
class Person:
def weight(self):
print('self=%s'%id(self))
pass
# liming=Person()
# liming.weight()
# print(id(liming))
# 5、定义一个Animal类
# (1)、使用__init__初始化方法为对象添加初始属性。如颜色,名字,年龄。
# (2)、定义动物方法,如run,eat等方法。如调用eat方法时打印xx在吃东西就可以。
# (3)、定义一个__str__方法,输出对象的所有属性。
class Animal:
def __init__(self,color,name,age):
'''
:param color:
:param name:
:param age:
'''
self.color=color
self.name = name
self.age = age
pass
def eat(self):
print('%s 在吃东西'%self.name)
pass
def run(self):
print('%s 在飞快的跑' % self.name)
pass
def __str__(self):
return '%s 的颜色是:%s 今年 %d 岁了'%(self.name,self.color,self.age)
def __del__(self):
print('xhl')
pass
tigger=Animal('黄色','东北虎',4)
tigger.run()
tigger.eat()
print(tigger)
# del tigger
input('ddz')
九、补充
(1)__mro__方法