Python——类和对象、魔术方法(day07)

目录

一、面向对象

二、类和对象

三、实例方法和属性

四、__init__方法

五、self

六、魔法方法

七、双人对决

八、作业

九、补充

面向对象编程: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__方法

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清园暖歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值