经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
第24天面向对象编程概述
来源:cnblogs  作者:沉沦的罚  时间:2018/10/23 9:24:19  对本文有异议

人生三问

  1. 什么是对象
  2. 实实在在存在的具有一定特征和行为的事物就是对象,万物皆对象。
  3. 什么是类
  4. 一系列具有相同特征和行为的对象的结合就叫做类。编程中,首先由类,才会有对象。
  5. 1. 什么是面向对象
      面向对象和面向过程都是一种编程的思想,一个在于过程,一个在于对象,面向对象就是把一切的事物都看成
    对象,我们需要完成事物的时候就通过对象帮我们完成,而不是像面向过程必须要自己去考虑方方面面来完成这样
    事情一样。
  6. 2. 为什么要用面向对象
      大环境:每个公司的业务都是在不断发展的,对于这种现状我们必须要有一个扩展性强的方法。
      优点:
        1.扩展性强。一切皆对象,一个对象增加属性并不会产生特点大的影响。
        2.简化了程序员的操作,我们不必再一步一步去完成事情,而是需要交给对象去完成就可以了
      缺点:
        1.增加了设计的复杂度。我们要事先设计好合适的对象,避免过度设计。
        2.程序的可控性降低。
  7. 3. 怎么使用面向对象

创建类和对象

  1. # 定义类,用【class 类名:】 定义一个类
  2. # 类名的规范:一般大写开头,使用驼峰命名法
  3. class SHOldboyStudent:
  4. # 用变量来定义类对象的特征(通常把特征称作属性)
  5. # 学生会有名字,年龄,性别,学校
  6. age = '11'
  7. name = 'egon'
  8. gender = 'female'
  9. school = 'HSOldboy'
  10. # 用函数来定义对象的行为(通常把行为称作方法)
  11. # 行为可以有多个,每次定义行为的时候都会自动加上一个参数self
  12. def say_hi(self):
  13. print('hi, i am boy!')
  14. def say_hello(self):
  15. print('hello, i am boy')
  16. # 创建对象,可以通过【类名()】来创建一个对象
  17. student = SHOldboyStudent()

类的属性

  1. 注意的点:
  2. 对象的名称空间和类的名称空间是相对独立的,如果是公共的属性才会放到类中。类中可以没有属性。
  3. 属性的查找顺序
      先从对象的名称空间 =====》类的名称空间。

查看属性(对象和类都可以的):

  1. # 创建对象,可以通过【类名()】来创建一个对象
  2. student = SHOldboyStudent()
  3. # 查看类中的名称空间
  4. print(SHOldboyStudent.name, SHOldboyStudent.__dict__)
  5. # 查看对象的名称空间
  6. print(student.__dict__)
  7. # 通过对象名称去访问相应的属性
  8. print(student.name)
  9. # 结果:
  10. # egon {'__module__': '__main__', 'age': '11', 'name': 'egon', 'gender': 'female', 'school': 'HSOldboy', 'say_hi': <function SHOldboyStudent.say_hi at 0x037E4F60>, 'say_hello': <function SHOldboyStudent.say_hello at 0x037F8078>, '__dict__': <attribute '__dict__' of 'SHOldboyStudent' objects>, '__weakref__': <attribute '__weakref__' of 'SHOldboyStudent' objects>, '__doc__': None}
  11. # {} # 对象的名称空间是空的
  12. # egon # 但是对象却可以访问到值,为什么呢,因为对于类中的属性而言,对于每个对象都是一样的,所以没有必要保存两份,当对象需要的时候直接去类中查找就是了

增加属性(只能是对象):

  1. # 增加属性只是增加到了对象中,类中的属性是不会发生改变的
  2. student = SHOldboyStudent()
  3. student.height = 15
  4. print(student.height) # 给对象student增加了一个身高的属性,所以能够访问到
  5. # print(SHOldboyStudent.height) 这个是会报错的,因为在类中并没有此属性

删除属性(只能是对象)

  1. # 删除属性只是删除对象中的属性,类中的属性是不会发生改变的
  2. student = SHOldboyStudent()
  3. student.height = 15
  4. print(student.height) # 给对象student增加了一个身高的属性,所以能够访问到
  5. del student.height
  6. print(student.height) # 在去查看的时候就会报错了,因为此时height属性已经被删除了
  7. # print(SHOldboyStudent.height) 这个是会报错的,因为在类中并没有此属性

更改属性(只能是对象)

  1. # 更改属性, 类中的属性不会发生改变
  2. student = SHOldboyStudent()
  3. print(student.name) # egon
  4. student.name = 'hu'
  5. print(student.name) # hu
  6. print(SHOldboyStudent.name) # egon

类的方法

类的特殊方法__init__

  1. # 定义类,用【class 类名:】 定义一个类
  2. # 类名的规范:一般大写开头,使用驼峰命名法
  3. class SHOldboyStudent:
  4. # 用变量来定义类对象的特征(通常把特征称作属性)
  5. # 学生会有名字,年龄,性别,学校
  6. age = '11'
  7. name = 'egon'
  8. gender = 'female'
  9. school = 'HSOldboy'
  10. # 用函数来定义对象的行为(通常把行为称作方法)
  11. # 行为可以有多个,每次定义行为的时候都会自动加上一个参数self
  12. def say_hi(self):
  13. print('hi, i am boy!')
  14. def say_hello(self):
  15. print('hello, i am boy')
指定定义的学生类
  1. 定义的学生类的问题:
      我们在类中定义的公共属性有nameagegender等,我们想一下,我们的学生都有不同的名字,年龄和性别,但是我们通过上面的类就会出现一样的属性,这显然是不合理的,我们不能定义这些属性,而是应该这每个对象自己去定义这些属性,因此
    有了下面这个版本。

改进版本:

  1. class SHOldboyStudent:
  2. # 目前这个学生类还没有任何的公共属性
  3. def say_hi(self):
  4. print('hi, i am boy!')
  5. def say_hello(self):
  6. print('hello, i am boy')
  7. # 创建一个对象学生一
  8. stu1 = SHOldboyStudent()
  9. # 为学生添加属性
  10. stu1.name = 'egon'
  11. stu1.age = 11
  12. stu1.gender = 'female'
  13.  
  14. # 创建一个对象学生二
  15. stu2 = SHOldboyStudent()
  16. # 为学生添加属性
  17. stu1.name = 'hu'
  18. stu1.age = 12
  19. stu1.gender = 'male'

问题二:这样的话虽然说解决了公共属性的问题,但是我们的对象每次创建的时候都要重新去添加属性,而且大部分添加的属性都是一样的,因此我们会想到通过函数去解决这样的问题:

  1. class SHOldboyStudent:
  2. # 目前这个学生类还没有任何的公共属性
  3. def say_hi(self):
  4. print('hi, i am boy!')
  5. def say_hello(self):
  6. print('hello, i am boy')
  7. def add_attribute(obj, name, age, gender):
  8. obj.name = name
  9. obj.age = age
  10. obj.gender = gender
  11. # 创建一个对象学生一
  12. stu1 = SHOldboyStudent()
  13. # 为学生添加属性
  14. add_attribute(stu1, 'egon', 11, 'female')
  15. print(stu1.name)
  16. # 创建一个对象学生二
  17. stu2 = SHOldboyStudent()
  18. # 为学生添加属性
  19. add_attribute(stu1, 'hu', 11, 'male')
  20. print(stu1.name)

问题三:这样子我们还需要重新再定义一个函数,然后把创建的对象放进去,很麻烦,此时就该我们的__init__文件发挥作用了

  1. __init__文件作用
      就是为了在创建对象的时候直接调用此函数进行复制,解决我们上面重新定义添加对象属性的问题
    注意:
      1. 需要为每个对象定制不同的属性值
      2. __init__在创建对象的时候自动执行
      3. __init__第一个self参数指的就是对象本身,不需要进行传递
  1. class SHOldboyStudent:
  2. # 这个init文件
  3. def __init__(self, name, age, gender): # 参数self就是之前的obj对象本身,此处只不过规范化了而已
  4. self.name = name
  5. self.age = age
  6. self.gender = gender
  7. def say_hi(self):
  8. print('hi, i am boy!')
  9. def say_hello(self):
  10. print('hello, i am boy')
  11. # 创建一个对象学生一
  12. stu1 = SHOldboyStudent('egon', 11, 'female') # 这里只需要传递三个对象属性值就可以了,对象的传递已经python已经直接帮我们进行封装了。
  13. # 创建一个对象学生二
  14. stu2 = SHOldboyStudent('hu', 11, 'male')

对象与方法的绑定

人生三问

  1. 绑定方法是什么
      绑定方法指的就是对象与方法的一种绑定关系。
  2. 为什么要用绑定方法
      通常对象的行为(也就是类的方法)都需要去访问这个对象的数据,或者去修改这个对象的数据,不去创建对象而直接去调用类的方法是没有意义的,所以将对象和和函数进行绑定。
  3. 怎么使用绑定方法
      在类中python本身就已经给我们进行绑定方法了,也就是通过self参数直接帮我们将对象本身传递进去。

1. 类去调用方法

  1. # 类调用方法就相当于是使用普通函数一样,该传什么值就传什么值
    class
    SHOldboyStudent:
  2. # 目前这个学生类还没有任何的公共属性
  3. def __init__(self, name, age, gender):
  4. self.name = name
  5. self.age = age
  6. self.gender = gender
  7. def say_hello(self):
  8. print(self)
  9. print('hello, i am boy')
  10. # 1.不进行传值,会报错
  11. SHOldboyStudent.say_hello(111)

2. 对象去调用类的方法 

  1. class SHOldboyStudent:
  2. # 目前这个学生类还没有任何的公共属性
  3. def __init__(self, name, age, gender):
  4. self.name = name
  5. self.age = age
  6. self.gender = gender
  7. def say_hello(self):
  8. print(self)
  9. print('hello, i am boy')
  10. # 1.可以直接进行传值,因为对象和方法已经进行绑定了
  11. student = SHOldboyStudent('egon', 11, 'male')
  12. student.say_hello()

小案例:

创建一个英雄类,创建两个英雄进行互砍

  1. class Hero:
  2. def __init__(self, blood, name, hero_type, q, w, e):
  3. self.blood = blood # 血量
  4. self.name = name # 名字
  5. self.hero_type = hero_type # 英雄类型
  6. self.q = q # q技能伤害
  7. self.w = w # w技能伤害
  8. self.e = e # e技能伤害
  9.  
  10. def hurt(self, enemy, skill):
  11. print('{name}向{enemy}释放了{skill}技能,造成伤害{hurt},敌军{enemy}剩余血量{blood}'.format(
  12. name=self.name,
  13. enemy=enemy.name,
  14. skill=skill,
  15. hurt='self.%s' % skill,
  16. blood=0 if enemy.blood - self.q < 0 else enemy.blood - self.q
  17. ))
  18. enemy.blood = enemy.blood - self.q
  19. if enemy.blood < 0:
  20. print('敌军{enemy}阵亡'.format(enemy=enemy.name))
  21. # 创建两个英雄对象
  22. yasuo = Hero(200, 'yasuo', 'zhanshi', 50, 100, 150)
  23. huangzi = Hero(200, 'huangzi', 'zhanshi', 60, 80, 180)
  24. yasuo.hurt(huangzi, 'q')
  25. yasuo.hurt(huangzi, 'e')

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号