python05——面向对象基础(1)
1.1面向对象介绍
面向过程——根据业务逻辑丛上到下写代码
函数式——将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象编程——将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
1.2.类和对象的概念
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能。类相当于制造汽车的图纸
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数。对象相当于制造好的汽车
类(Class)由3个部分构成
类的名称:类名
类的属性:一组数据,即具有一组相似特征(属性)和行为(方法)的一系列对象的集合
类的方法:允许对进行操作的方法(行为)
eg.创建一个人类(对象),类名:人(Person),属性:身高(height)、 年龄(age),方法:吃(et),跑(run)
类的抽象
具有相同(或者类似)属性和行为的一系列对象的集合都可以抽像出一个类
●例1:小明开着他家的宝马去逛街
小明->可以抽象中人类
宝马->可以抽象出车类
●例2:抽象坦克大战中的类
坦克 墙 子弹
类名: Tank 类名: Wall 类名: Bullet
属性:血量类型 属性:血量类型 属性:杀伤力
方法:发射子弹 方法:阻挡
1.3.定义类和对象
###创建类 class Person: ##采用大驼峰方式命名(单词首字母大写) name='yh' age='18' def eat(self): print("大口的吃饭") pass def run(self): print("飞快的跑") ###创建对象 xm=Person() print("{}的年龄是{}".format(xm.name,xm.age)) xm.eat() ##调用函数
1.4.实例方法与属性
在类的内部,使用def关键字可以定义一个实例方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。一个类中可以有多个实例方法。
类中的属性——类属性,如上面的name、age
类中实例的属性——实例属性,通过self.变量名定义
def __int__(self): self.name='yh'
1.5._init_方法
class People: def __init__(self): self.name='小倩' self.sec='girl' self.age='20' def eat(self): print('喜欢吃榴莲') pass xq=People() xq.name='小倩' xq.age=20 xq.sex='girl' xq.eat() print(xq.name,xq.sex,xq.age)
传参:
class People: def __init__(self,name,sex,age): self.name=name self.sex=sex self.age=age def eat(self,food): print(self.name+'喜欢'+food) pass zp=People('张鹏','boy','12') print(zp.name,zp.sex,zp.age) zp.eat('香蕉')
1.6.理解self
self就是对象的引用,在类中定义实例方法的时候才有意义,在调用时不必传入相应的参数,而是由解释器自动的去指向,名称可以改
1.7.魔法方法
常见的魔法方法:
__init__方法:初始化一个类,在创建实例对象为其赋值时使用。
__str__方法:在将对象转换成字符串 str(对象)测试的时候,打印对象的信息。
class an(): def __init__(self,name,color): self.name=name self.color=color pass def __str__(self): return '我的名字是%s,我的颜色是%s'%(self.name,self.color) pass dog=an('旺财','black') print(dog)
__new__方法:创建并返回一个实例对象,调用了一次,就会得到一个对象。
class an(): def __init__(self,name,color): self.name=name self.color=color pass def __str__(self): return '我的名字是%s,我的颜色是%s'%(self.name,self.color) ##场景:可以控制创建对象的一些属性限定 def __new__(cls, *args, **kwargs):##第一个被执行的函数 print('----new执行-----') return object.__new__(cls) ###真正创建对象实例的 dog=an('旺财','black') print(dog)
__new__和__init__函数的区别:
new类的实例化方法必须要返回该实例,否则对象就创建不成功,至少要一个参数是cls代表要实例化的类,此参数自动提供
init用来数据属性的初始化工作
执行时new早于init
1.8.案例-决战紫禁之巅
决战紫禁之巅有两个人物,yh以及lh
属性:name玩家的名字,blood玩家血量
方法:tong()捅对方一刀,对方掉血10滴
kanren()砍对方一刀,对方掉血15滴
chiyao()吃一颗药,补血10滴
__str__打印玩家状态。
2.1
###定义一个类【角色类】 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: ''' enemy.hp-=10 #敌人减10滴血 info='【%s】捅了【%s】一刀'%(self.name,enemy.name) print(info) def kanren(self,enemy): ''' 砍人 :param enemy: :return: ''' enemy.hp -= 15 # 敌人减10滴血 info = '【%s】砍了【%s】一刀' % (self.name, enemy.name) print(info) def chiyao(self,): ''' 吃药 :return: ''' self.hp += 10 info = '【%s】吃了一颗补血药' % (self.name) print(info) def __str__(self): return '%s还剩下%s的血量'%(self.name,self.hp) ###创建【yh/lh】2个实例化对象 yh=Role('yh',100) lh=Role('lh',100) while True: if yh.hp<=0 or lh.hp<=0: break yh.tong(lh) ##yh捅lh print(yh) print(lh) print('-----------------') lh.kanren(yh) print(yh) print(lh) print('-----------------') yh.chiyao() print(yh) print(lh) time.sleep(1) ##休眠一秒 print('对战结束')
巩固:
1.定义一个水果类,然后通过水果类,创建苹果对象、橘子对象、西瓜对象并分别添加上颜色属性
class shuiguo: def __init__(self,name,color): self.name=name self.color=color def __str__(self): return '%s的颜色是%s'%(self.name,self.color) pg=shuiguo('苹果','红色') jz=shuiguo('橘子','橙色') print(pg) print(jz)
2、定义一个Animal类
(1)、 使用__init__初始化方法为对象添加初始属性。如颜色,名字,年龄。
(2)、定义动物方法,如run, eat等方法。 如调用eat方法时打印xx在吃东西就可以。
(3)、定义一个__str__方法,输出对象的所有属性。
class animal: def __init__(self,name,age,color): self.name=name self.age=age self.color=color def run(self): print('{}在跑步'.format(self.name)) def eat(self): print('{}在吃东西'.format(self.name)) def __str__(self): return '【%s】的年龄【%s】,颜色【%s】'%(self.name,self.age,self.color) tz=animal('兔子','1岁','白色') print(tz)
class People:
###改进
def __init__(self):
self.name='小倩'
self.sec='girl'
self.age='20'
def eat(self):
print('喜欢吃榴莲')
pass
xq=People()
xq.name='小倩'
xq.age=20
xq.sex='girl'
xq.eat()
print(xq.name,xq.sex,xq.age)