目录
面向对象介绍
面向过程:根据业务逻辑从上到下写代码
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可。
面向对象编程:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
面向过程的关注点是怎么做,而面向对象的关注点是谁来做。
类和对象的概念
类:类是具有一组相同或者相似特征【属性】和行为【方法】的一系列[多个]对象组合。
对象: 对象是实实在在的一个东西,类的实例化,具象化。
类的结构 类名 属性 方法
class 类名:
属性
方法
class Person: #类名建议首字母大写
'''
对应人的特征
'''
name='小明' #类属性
age=18
'''
对应人的行为
'''
def __init__(self):
self.name='小白' #实例属性--self.变量名
pass
def eat(self): #实例方法
print('大口吃饭')
pass
def run(self): #self名字可以换成其他,但是位置必须存在
print('飞速跑')
pass
#创建一个对象{类的实例化}
#规则格式 对象名=类名()
xm=Person()
xm.eat() #调用函数
xm.run()
print('{}的年龄是:{}'.format(xm.name,xm.age))
#创建一个实例对象
xw=Person()
xw.age()
__init__方法
1.python自带的内置函数 具有特殊的函数 使用双下线【魔术方法】
2.是一个初始化的方法 用来定义实例属性和初始化数据的,在创建对象的时候自动调用 ,不用手动调用
3.利用传参的机制可以让我们的功能更加强大并且方便类
class people:
def __init__(self):
'''
实例属性
'''
self.name='小倩'
self.sex='女生'
self.age=20
pass
def eat(self):
'''
吃的行为
:return:
'''
print('喜欢吃榴莲')
pass
xq=people()
xq.name='小倩' #添加实例属性
xq.sex='女生'#添加实例属性
xq.age=20#添加实例属性
xq.eat()
#print(xq.name,xq.sex,xq.age)
xl=people()
xl.name='小丽' #添加实例属性
xl.sex='女生'#添加实例属性
xl.age=20
xm=people() #在创建新对象的时候,是自动执行init
print(xm.name)#直接输出的是默认值
xm.name='小明'
print(xm.name)
init传递参数、改进
class people:
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=people('张鹏','男生',18)
print(zp.name,zp.age)
zp.eat('香蕉')
lh=people('李辉','男生',20)
print(lh.name,lh.age)
lh.eat('苹果')
理解self
1.self只有在定义实例类方法的时候才有意义,在调用时候不必传入相应的参数,而是由解释器自动去指向
2.self的名称是可以更改的,可以定义其他的名字,只是约定俗成的定义成self
3.self 指的是类实例对象本身
class Person:
def __init__(self,pro,name,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): #如果没有str,直接输出是对象的地址
'''
打印对象 自定义对象是内容形式的
:return:
'''
return '%s 喜欢吃 %s 修的专业是:%s'%(self.name,self.food,self.pro)
def __new__(cls, *args, **kwargs):
'''
创建对象实例的方法,每调用一次就会生产一个新的对象 cls就是class的缩写
场景:可以控制创建对象的一些属性限定,经常用来做单例模式的时候使用
:param args:
:param kwargs:
'''
print('--------new----函数的执行')
return object.__new__(cls) #在这里是创建对象实例的
pass
pass
xw=Person('计算机','小王','榴莲')
#print('xw=%s'%id(xw))
#xw.eat('小王','榴莲')#不需要给self传参,xw跟self指向的是同一个对象
print(xw) #直接输出对象
__new__和__init__的区别:
1.__new__类的实例话方法,必须返回该实例,否则对象就创建不成功
2.__new__至少有一个参数实cls代表要实例化的类,此参数在实例化时由python解释器自动提供
3.__new__函数执行要早于__init__函数
4.__init__用来做数据属性的初始化工作,也可以认为是实例的构造方法,接受的实例self并对其构造
案例
1.
有两个人物,西门吹雪以及叶孤城
属性: name 玩家的名字 blood 玩家血量
方法: tong() 捅对方一刀,对方掉血10滴 kanren() 砍对方一刀,对方掉血15滴 chiyao() 吃一颗药,补血10滴
__str__ 打印玩家状态。
import time #导入时间库
class Role:
def __init__(self,name,hp):
'''
构造初始化函数
:param name:角色名
:param hp:血量
'''
self.name=name
self.hp=hp
pass
def tong(self,enemy):
'''
捅一刀
:param enemy:敌人
:return:
'''
#敌人减掉10滴血
enemy.hp-=10
info = '%s捅了%s一刀' % (self.name, enemy.name)
print(info)
pass
def kanren(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)
pass
#第二步创建倆个实例化对象
xmcx=Role('西门吹雪',100)
ygc=Role('叶孤城',100)
while True:
if xmcx.hp<=0 or ygc.hp<=0:
break;
xmcx.tong(ygc) #西门吹雪捅了叶孤城一刀
print(ygc) #打印对象的状态
print(xmcx)
print('******************************')
ygc.kanren(xmcx)
print(ygc) #打印对象的状态
print(xmcx)
print('******************************')
xmcx.chiyao()
print(ygc) #打印对象的状态
print(xmcx)
print('******************************')
time.sleep(1) #延时一秒
print('对战结束')