python基础22 面向对象和类

164 阅读4分钟

面向对象的引出

  • 我们如果要写一个宠物对战的小游戏,怎么去实现它呢
1.我们会用字典定义一个两个宠物数据,例如战斗力,血量之类的。再次添加许多宠物呢?
2.我们就会觉得麻烦,由于定义他们的字典基本不变,再需要使用就可以封装成函数。
3.让不同类型的宠物拥有攻击的能力,就需要定义不同函数供不同类型宠物使用。
4.但是此时,特定的宠物类型虽然可以攻击了,但是可以调用封装好的其他类型宠物攻击。
5.此时会出现,调用乱套的情况,所以我们将不同类型的函数功能分别放到不同宠物类型。
6.需要攻击时,宠物只会调用自己类型的攻击函数。
  • 此时我们实现了不同类型函数,调用不同功能的过程
    • 我们把这个过程称为面向对象
  • 什么是面对对象编程?
    • 我们将数据与功能绑定到一起的操作起名为:'面向对象编程'
  • 面对对象编程的本质?
    • 将特定的数据与特定的功能绑定到一起 将来只能彼此相互使用
  • 编程的思想
    • 面向过程编程
      • 面向过程编程其实就是按步骤执行一系列流程,最后得到结果
    • 面向对象编程
      • 面向对象编程的核心是对象,相当于提供了一个解决问题的具体方案。
      • 面向对象编程就是当你创造一些事物后,后续问题无需处理
    • 两种编程思想并无优劣之分,经常混合使用

对象与类的概念

  • 对象的概念
    • 对象:数据与功能的结合体
  • 对象的作用
    • 对象用于记录多个对象不同的数据和功能
  • 类的概念
    • 类:多个对象相同的数据和功能的结合体
  • 类的作用
    • 类主要用于记录多个对象相同的数据和功能
  • 在面向对象编程中 类仅仅是用于节省代码,对象才是核心

对象与类的创建

  • 类的创建
    • 关键字: class
    • 模板
      • 类名第一个字母要大写
      class 类名:    
           学生对象公共的数据 (类体的代码)
           学生对象公共的方法 (类体的代码)
      
    • 类体与函数不同,再定义阶段就会执行
    • 查看名称空间的方法
    print(类名.__dict__)                      # 使用该方法查看名称空间 可以看成是一个字典
    print(类名.__dict__['school'])               # 使用字典的取值方式获取名字
    print(类名.__dict__.get('choice_course'))    # 使用字典的取值方式获取名字
    
    • 在面向对象编程中 想要获取名称空间中的名字 可以采用句点符
    print(类名.school)
    print(类名.choice_course)
    
    • 类实例化产生对象
    类名.键名 = '修改后的值'     # 修改键名对应的值
    

对象独有的数据

  • 怎么样往对象内添加该对象与众不同的数据呢?

定义一个学生类

class Student:
    # 学生对象公共的数据
    school = '清华大学'

    # 学生对象公共的方法
    def choice_course(self):
        print('正在选课')
  • 一.直接利用__dict__方法朝字典添加键值对
    • 但是缺点非常明显:需要我们收到输入,并且新添加一个学生就会输入一次,代码冗余,效率低下
self = Student()
self.__dict__['name'] = 'tom          #与self1.name = 'tom'含有相同      
print(self.name)
self1 = Student()
self1.__dict__['name'] = 'jack'        #与self1.name = 'jack'含有相同     
print(self1.name)
  • 二.添加独有的代码封装成函数
    • 虽然添加的代码变少了,但是还是需要我们每次添加姓名要重新用一个变量名,比较麻烦
def init(self,name)
    self.__dict__['name] = name
stu0 = Student()
stu1 = Student()
init(stu0,'tom')
init(stu1,'jack')
print(stu0.__dict__)
print(stu1.__dict__)
  • 三.面向对象思想,使用init函数创建独有的数据,将数据功能整合到一起
    • 将函数封装到学生类中 这样只有学生类产生的对象才有资格访问,简洁省时省力
""" 
1.先产生一个空对象
2.调用类里的__init__方法,把产生空对象当作第一个参数传入
3.将产生的对象返回出去
"""
class Student: 
    def __init__(self, name):
        self.name = name    # obj.__dict__['name'] = name
             
    # 学生对象公共的数据
    school = '清华大学'

    # 学生对象公共的方法
    def choice_course(self):
        print('正在选课')

stu1 = Student('jason')
print(stu1)
stu2 = Student('kevin')
print(stu2)