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


    目录

    一、面向对象

    二、类和对象

    三、实例方法和属性

    四、__init__方法

    五、self

    六、魔法方法

    七、双人对决

    八、作业

    九、补充

    面向对象编程:oop [object oriented programming] 是一种python的编程思路
    面向过程:就是我们一开始学习的,按照解决问题的步骤去写代码 【根据业务逻辑去写代码】
    在思考问题的时候, 首先分析'怎么按照步骤去实现' 然后将问题解决拆解成若干个步骤,并将这些步骤对应成方法一步一步的 最终完成功能
    面向对象:关注的是设计思维【找洗车店   给钱洗车】

    出差--北京
    小明-- 什么时间 - -买什么票【高铁 汽车 飞机】---酒店---回程时间
    亲力亲为的去做 【面向过程】

    面向过程不足:小明没有更多的精力去考虑别的事情

    boss--- 秘书【小明需要考虑的事情】----财务----目的:北京 【面向对象】

    boss有更多的精力去处理其他的时候,创造更多的价值

    从计算机的角度来看:面向过程不适合做大项目

    而面向对象合适做更大项目的设计

    类和对象

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

    现实世界    计算机世界
    行为---------> 方法
    特征---------->属性

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

    类是对象的抽象化  而对象是类的一个实例

    实例方法:在类的内部,使用def 关键字来定义  第一个参数默认是 self【名字标识可以是其他的名字,但是这个位置必须被占用】

    实例方法是归于 类的实例所有

    属性:类属性  实例属性
    在类的内部定义的变量【类属性】
    在方法内部定义的【通过类似于self.变量名】 变量,是实例属性

    一、面向对象

    面向过程的关注点是:怎么做

    面向对象的关注点是:谁来做

    二、类和对象

     

     

    三、实例方法和属性

    self只是一个关键字,可以换成其他的,他必须作为第一个参数在类中存在,才是实例方法,实例方法归实例所有,任何实例都可以调用,对象就是类的实例

    1. # 定义类和对象
    2. # 类结构 类名 属性 方法
    3. # class 类名:
    4. # 属性
    5. # 方法
    6. class Person:
    7. '''
    8. 对应人的特征
    9. '''
    10. # name='小明' #类属性
    11. age=20 #类属性
    12. '''
    13. 对应人的行为 实例方法
    14. '''
    15. def __init__(self):
    16. self.name='小明' #实例属性
    17. pass
    18. def eat(parms):
    19. print("大口的吃饭")
    20. pass
    21. def run(self): #实例方法
    22. print('飞快的跑')
    23. pass
    24. pass
    25. def printInfo():
    26. '''
    27. 普通方法
    28. :return:
    29. '''
    30. pass
    31. # 创建一个对象【类的实例化】
    32. # 规则格式 对象名=类名()
    33. xm=Person()
    34. xm.eat() #调用函数
    35. xm.run()
    36. print("{}的年龄是:{}".format(xm.name,xm.age))
    37. # 创建另外一个实例对象
    38. xw=Person()
    39. xw.eat() #实例方法

    四、__init__方法

     

     类属性方法不能修改值,实例属性可以

    __init__也叫初始化方法

    1. # class Pepole:
    2. # def __init__(self):
    3. # '''
    4. # 实例属性的声明
    5. # '''
    6. # self.name='小倩'
    7. # self.sex='女生'
    8. # self.age=20
    9. # pass
    10. # def eat(self):
    11. # '''
    12. # 吃的行为
    13. # :return:
    14. # '''
    15. # print('喜欢吃榴莲')
    16. # pass
    17. #
    18. # xq=Pepole()
    19. # xq.name='小倩' #添加实例属性
    20. # xq.sex='女生' #添加实例属性
    21. # xq.age=20 #添加实例属性
    22. # xq.eat()
    23. # # print(xq.name,xq.sex,xq.age)
    24. #
    25. # xl=Pepole() #创建出来的
    26. # xl.name='小倩' #添加实例属性
    27. # xl.sex='女生' #添加实例属性
    28. # xl.age=20 #添加实例属性
    29. #
    30. # xm=Pepole() #在创建新对象的时候 是自动执行的
    31. # print(xm.name) #直接输出的是默认值
    32. # xm.name='小明'
    33. # print(xm.name)
    34. # 如果有n个这个对象 被实例化 那么就需要添加很多次这样的属性了 显然是比较麻烦
    35. # init传递参数 改进
    36. class Pepole:
    37. def __init__(self,name,sex,age):
    38. '''
    39. 实例属性的声明
    40. '''
    41. self.name=name
    42. self.sex=sex
    43. self.age=age
    44. pass
    45. def eat(self,food):
    46. '''
    47. 吃的行为
    48. :return:
    49. '''
    50. print(self.name+'喜欢吃'+food)
    51. pass
    52. zp=Pepole('张鹏','男生',18)
    53. print(zp.name,zp.age)
    54. zp.eat('香蕉')
    55. lh=Pepole('李辉','男生',28)
    56. lh.eat('苹果')
    57. print(lh.name,lh.age)
    58. xh=Pepole('小花','女生',20)
    59. xh.eat('橘子')
    60. print(xh.name,xh.age)
    61. # 总结 __init__
    62. # 1. python 自带的内置函数 具有特殊的函数 使用双下划线 包起来的【魔术方法】
    63. # 2. 是一个初始化的方法 用来定义实例属性 和初始化数据的,在创建对象的时候自动调用 不用手动去调用
    64. # 3. 利用传参的机制可以让我们定义功能更加强大并且方便的 类

    五、self

    六、魔法方法

     (1)str方法

    通常用来查看常用信息,没有str时直接打印实例对象出现地址,有str时出现他的return

     (2)new方法

    new比init先执行,实例化类,创建的实例对象的返回值给init的第一个参数,不写new会自动调用

    1. class Person:
    2. def __init__(self,pro,name,food):
    3. '''
    4. :param pro: 专业
    5. :param name: 姓名
    6. :param food: 食物
    7. '''
    8. self.pro=pro #实例属性的定义
    9. self.name=name
    10. self.food=food
    11. print('----init-----函数执行')
    12. pass
    13. '''
    14. 定义类
    15. '''
    16. def eat(self,name,food):
    17. '''
    18. 实例方法
    19. :return:
    20. '''
    21. # print('self=%s',id(self))
    22. print('%s 喜欢吃 %s 修的专业是:%s'%(self.name,self.food,self.pro))
    23. pass
    24. def __str__(self):
    25. '''
    26. 打印对象 自定义对象 是内容格式的
    27. :return:
    28. '''
    29. return '%s 喜欢吃 %s 修的专业是:%s'%(self.name,self.food,self.pro)
    30. pass
    31. def __new__(cls, *args, **kwargs):
    32. '''
    33. 创建对象实例的方法 每调用一次 就会生成一个新的对象 cls 就是class的缩写
    34. 场景:可以控制创建对象的一些属性限定 经常用来做单例模式的时候来使用
    35. :param args:
    36. :param kwargs:
    37. '''
    38. print('----new-----函数的执行')
    39. return object.__new__(cls) #在这里是真正创建对象实例的
    40. pass
    41. pass
    42. # xw是一个新的实例化对象
    43. xw=Person('心理学','小王','榴莲')
    44. # print('xw=%s',id(xw))
    45. # xw.eat('小王','榴莲')
    46. print(xw) #直接输出对象
    47. # 小结 self特点
    48. # self只有在类中定义 实例方法的时候才有意义,在调用时候不必传入相应的参数 而是由解释器 自动去指向
    49. # self的名字是可以更改的 可以定义成其他的名字,只是约定俗成的定义成了 self
    50. # self 指的是 类实例对象本身, 相当于java中 this
    51. # __new__和__init___函数的区别
    52. # __new__ 类的实例化方法 必须要返回该实例 否则对象就创建不成功
    53. # __init___ 用来做数据属性的初始化工作 也可以认为是实例的构造方法 接受类的实例 self 并对其进行构造
    54. # __new__ 至少有一个参数是 cls 代表要实例化的类 ,此参数在实例化时由python解释器自动提供
    55. # __new__ 函数 执行要早于 __init___ 函数

    七、双人对决

    1. # 决战紫禁之巅有两个人物,西门吹雪以及叶孤城
    2. # 属性:
    3. # name 玩家的名字
    4. # blood 玩家血量
    5. #
    6. # 方法:
    7. # tong() 捅对方一刀,对方掉血10滴
    8. # kanren() 砍对方一刀,对方掉血15滴
    9. # chiyao() 吃一颗药,补血10滴
    10. # __str__ 打印玩家状态。
    11. #
    12. # 第一步 需要先去定义一个类【角色类】
    13. import time # 导入时间的包
    14. import random
    15. class Role:
    16. def __init__(self,name,hp):
    17. '''
    18. 构造初始化函数
    19. :param name: 角色名
    20. :param hp: 血量
    21. '''
    22. self.name = name
    23. self.hp = hp
    24. pass
    25. def tongyidao(self,enemy):
    26. '''
    27. 捅人
    28. :param enemy:敌人
    29. :return:
    30. '''
    31. # 敌人掉10血
    32. enemy.hp -= 10
    33. info = '[%s]捅了[%s]一刀' %(self.name,enemy.name)
    34. print(info)
    35. pass
    36. def kanyidao(self,enemy):
    37. '''
    38. 砍人
    39. :param enemy:敌人
    40. :return:
    41. '''
    42. # 敌人掉15血
    43. enemy.hp -= 15
    44. info = '[%s]砍了[%s]一刀' %(self.name, enemy.name)
    45. print(info)
    46. pass
    47. def chiyao(self):
    48. '''
    49. 吃药
    50. :return:
    51. '''
    52. self.hp += 10
    53. info = '[%s]吃了一颗补血药,增加了10滴血' %(self.name)
    54. print(info)
    55. pass
    56. def __str__(self):
    57. return '%s 还剩下 %s 的血量' %(self.name, self.hp)
    58. # 第二步 创建2个:西门吹雪、叶孤城 实例化对象
    59. xmcx = Role('西门吹雪', 100)
    60. ygc = Role('叶孤城', 100)
    61. def xmcx_zhandou(go):
    62. """
    63. xmcx所有可能发生的状况
    64. :param go: 随机战斗的值
    65. :return:
    66. """
    67. if go == 1:
    68. xmcx.tongyidao(ygc) # 西门吹雪捅了叶孤城一刀+
    69. elif go == 2:
    70. xmcx.kanyidao(ygc) # 西门吹雪看了叶孤城一刀
    71. else:
    72. xmcx.chiyao() # 西门吹雪吃药
    73. pass
    74. def ygc_zhandou(go):
    75. """
    76. ygc所有可能发生的状况
    77. :param go: 随机战斗的值
    78. :return:
    79. """
    80. if go == 1:
    81. ygc.tongyidao(xmcx) # 叶孤城捅了西门吹雪一刀
    82. elif go == 2:
    83. ygc.kanyidao(xmcx) # 叶孤城看了西门吹雪一刀
    84. else:
    85. ygc.chiyao() # 叶孤城吃药
    86. pass
    87. # for i in range(1,10):
    88. # go = random.randint(1,4)
    89. # print(go)
    90. i = 1 # 回合数
    91. while 1:
    92. xmcx_go = random.randint(1,3) # xmcx随机战斗状况
    93. ygc_go = random.randint(1,3) # ygc随机战斗状况
    94. xianshou = random.randint(1,2) # 随机先手
    95. print('--------------------第 %d 回合----------------------' % i)
    96. if xmcx.hp <= 0 or ygc.hp <= 0:
    97. break
    98. if xianshou == 1: # xmcx先手
    99. xmcx_zhandou(xmcx_go)
    100. ygc_zhandou(ygc_go)
    101. else:
    102. ygc_zhandou(ygc_go) # ygc先手
    103. xmcx_zhandou(xmcx_go)
    104. print(xmcx) # 打印对象状态
    105. print(ygc) # 打印对象状态
    106. time.sleep(2) # 延时1s
    107. i += 1
    108. pass
    109. print('对战结束')
    110. if xmcx.hp <= 0:
    111. print('[叶孤城]获胜')
    112. elif ygc.hp <= 0:
    113. print('[西门吹雪]获胜')
    114. # while True:
    115. # if xmcx.hp <= 0 or ygc.hp <= 0:
    116. # break
    117. # xmcx.tongyidao(ygc) # 西门吹雪捅了叶孤城一刀
    118. # print(ygc) # 打印对象状态
    119. # print(xmcx)
    120. # print('---------------------------------------------')
    121. # ygc.tongyidao(xmcx)
    122. # print(ygc) # 打印对象状态
    123. # print(xmcx)
    124. # print('---------------------------------------------')
    125. # xmcx.chiyao()
    126. # print(ygc) # 打印对象状态
    127. # print(xmcx)
    128. # print('---------------------------------------------')
    129. # time.sleep(1) # 延时1s
    130. # pass
    131. #
    132. # print('对战结束')

    八、作业

    1. # 1、python中如何通过类创建对象,请用代码举例说明。
    2. class Student:
    3. def run(self):
    4. print('学生每天进行2000米的跑步训练')
    5. pass
    6. pass
    7. xiaoli=Student() #创建一个对象
    8. xiaoli.run()
    9. # 2、如何在类中定义一个方法,请用代码举例说明。
    10. # 参考上述demo
    11. # 3、定义一个水果类,然后通过水果类,创建苹果对象、橘子对象、西瓜对象并分别添加上颜色属性
    12. class SgClass:
    13. def __init__(self,name,color):
    14. '''
    15. :param name:
    16. :param color:
    17. '''
    18. self.color=color
    19. self.name=name
    20. pass
    21. def __str__(self):
    22. return '%s 的颜色是【%s】'%(self.name,self.color)
    23. pass
    24. pg=SgClass('苹果','红色')
    25. pg.zj=10 #通过对象添加对象属性
    26. print(pg)
    27. print('*'*40)
    28. jz=SgClass('橘子','橙色')
    29. print(jz)
    30. print('*'*40)
    31. xg=SgClass('西瓜','黑皮')
    32. print(xg)
    33. # 4、请编写代码,验证self就是实例本身。
    34. class Person:
    35. def weight(self):
    36. print('self=%s'%id(self))
    37. pass
    38. # liming=Person()
    39. # liming.weight()
    40. # print(id(liming))
    41. # 5、定义一个Animal类
    42. # (1)、使用__init__初始化方法为对象添加初始属性。如颜色,名字,年龄。
    43. # (2)、定义动物方法,如run,eat等方法。如调用eat方法时打印xx在吃东西就可以。
    44. # (3)、定义一个__str__方法,输出对象的所有属性。
    45. class Animal:
    46. def __init__(self,color,name,age):
    47. '''
    48. :param color:
    49. :param name:
    50. :param age:
    51. '''
    52. self.color=color
    53. self.name = name
    54. self.age = age
    55. pass
    56. def eat(self):
    57. print('%s 在吃东西'%self.name)
    58. pass
    59. def run(self):
    60. print('%s 在飞快的跑' % self.name)
    61. pass
    62. def __str__(self):
    63. return '%s 的颜色是:%s 今年 %d 岁了'%(self.name,self.color,self.age)
    64. def __del__(self):
    65. print('xhl')
    66. pass
    67. tigger=Animal('黄色','东北虎',4)
    68. tigger.run()
    69. tigger.eat()
    70. print(tigger)
    71. # del tigger
    72. input('ddz')

    九、补充

    (1)__mro__方法

  • 相关阅读:
    介孔二氧化硅包裹超顺磁性Fe3O4纳米颗粒表面氨基修饰|齐岳生物
    Vuex使用一文搞懂
    PHP导出word方法(一mht)
    react ant design Upload 多文件上传 beforeUpload 会调用很多次,怎么只获取一次
    JAVA计算机毕业设计在线玩具租赁系统Mybatis+源码+数据库+lw文档+系统+调试部署
    LeetCode算法位运算—只出现一次的数字
    浅浅研究模板字符串 ` `
    Hadoop 集群一直处于安全模式,强制退出后出现数据丢失警告。解决方法
    Kubernetes 部署RocketMQ高可用集群
    独家首发,阿里内部纯手码spring boot项目,你学会了吗?
  • 原文地址:https://blog.csdn.net/qq_47941078/article/details/125350191