面向对象编程: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__也叫初始化方法

- # 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. 利用传参的机制可以让我们定义功能更加强大并且方便的 类




(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__方法
