面向对象(上)

目录

面向对象介绍

类和对象的概念

 __init__方法

理解self

案例


面向对象介绍

面向过程:根据业务逻辑从上到下写代码

函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可。

面向对象编程:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程

面向过程的关注点是怎么做,而面向对象的关注点是谁来做。

类和对象的概念

类:类是具有一组相同或者相似特征【属性】和行为【方法】的一系列[多个]对象组合。

对象: 对象是实实在在的一个东西,类的实例化,具象化。

类的结构 类名 属性 方法

       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('对战结束')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值