python day15 面向对象编程

目录:

面向对象编程

类 class 和 对象 object

什么是对象:

对象是指现实中的物体或实例

什么是面向对象:

把一切看成对象(实例),对象和对象之间用方法(行为)建立关联关系

什么是类:

  1. 拥有相同属性和行为的对象分为一组,即为一个类
  2. 类是用来描述对象的工具

面向对象示意

车(类)  ----->> BYD E6(京A.88888) 对象(实例)
         \
          \--->> BMW X5(京B.00000) 对象(实例)

  狗(类)  ----->> 小京巴(户籍号: 00001)
         \
          \--->> 导盲犬(户籍号:00002)

  int(类)  --->> 100(对象)
          \
           \-->> 200(对象,实例)

类的创建语法:

 class 类名(继承列表):
      """类文档字符串"""
      实例方法(类内的函数methd) 的定义
      类变量(class variable) 定义
      类方法(@classmethod)定义
      静态方法(@staticmethod)定义

类的作用:

  1. 可以用类创建一个或多个此类的对象(实例)
  2. 类内的变量和方法能被此类所创建的所有实例所共同拥有

  3. 说明:
    类名必须是标识符(与变量名命名规则相同,建议首字母大写)
    类名实质上就是变量,它绑定一个类实例
    类的定义最后面要加两个空格以告诉解释执行器,类的定义已经结束

  4. 示例:
    class Dog:
    pass

术语

对象 实例
class object instance

构造函数:

  1. 构造函数的调用表达式 
      类名([创建传参列表])
    [] 里的内容代表可省略
  2. 作用:
      创建这个类的实例对象,并返回此实例对象的引用关系
  3. 示例:

      class Dog:  # 定义一个类
          pass
      dog1 = Dog()     # 用类来创建一个对象用dog1绑定
      print(id(dog1))  # 打印dog1所在的内存地址
      dog2 = Dog()  #  创建第二个对象 用dog2绑定
      print(id(dog2))
      print(dog1 is dog2)  # 判断两只狗是不是同一条狗

实例说明:

  1. 实例有自己的作用域或名字空间,可以为该实例添加实例变量(也叫属性)
  2. 实例可以调用类的方法
  3. 实例可以访问类中的类变量

实例变量(属性 attribute)

  1. 每个实例可以有自己的变量,称为实例变量(属性)

  2. 属性的使用语法:
    实例.属性名

  3. 属性的赋值规则:(同变量规则相同)

    1. 首次为属性赋值则创建此属性
    2. 再次为属性赋值则改变属性的绑定关系
  4. 示例:

      class Dog:
          pass
      dog1 = Dog()
      dog1.kinds = "京巴"  #为dog1绑定的实例添加kinds属性
      dog1.color = "白色"  # 添加属性
      print(dog1.kinds, dog1.color)  # 访问属性
      dog1.color = '黄色' # 修改dog1.color 的绑定关系
      print(dog1.color)
  5. 练习:

    1. 自己写一个Student类,此类的对象有属性name, age, score, 用来保存学生的姓名,年龄,成绩
    2. 写一个函数 input_student读入n个学生的信息,用对象来存储这些信息(不用字典), 并返回对象的列表
    3. 写一个函数output_student 打印这些学生信息(格式不限)
    4. 示意:
      class Dog:
          pass
      dog1 = Dog()
      dog1.kinds = "京巴"  #为dog1绑定的实例添加kinds属性
      dog1.color = "白色"  # 添加属性
      print(dog1.kinds, dog1.color)  # 访问属性
      dog1.color = '黄色' # 修改dog1.color 的绑定关系
      print(dog1.color)

删除属性

  1. del 语句
  2. 语法:
    del 对象.属性名
  3. 示例:

      class Student:
          pass
    
      stu = Student()
      stu.name = 'xiaozhang'  # 创建属性
      print(stu.name)
      del stu.name  # 删除此属性
      print(stu.name)  # 属性错误,因为属性已经不存在了

属性管理函数

  1. getattr(obj, name[, default]) 从一个对象得到对象的属性;getattr(x, ‘y’) 等同于x.y; 当属性不存在时,如果给出default参数,则返回default,如果没有给出default 则产生一个AttributeError错误

  2. hasattr(obj, name) 用给定的name返回对象obj是否有此属性,此种做法可以避免在getattr(obj, name)时引发错误

  3. setattr(obj, name, value) 给对象obj的名为name的属性设置相应的值value, set(x, ‘y’, v) 等同于 x.y = v

  4. delattr(obj, name) 删除对象obj中的name属性, delattr(x, ‘y’) 等同于 del x.y

实例方法 method

1.语法:

class 类名(继承列表):
        def 实例方法名(self, 参数1, 参数2, ....):
           语句块 
  1. 作用:
    用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为
  2. 说明
    实例方法的实质是函数,是定义在类内的函数
    实例方法的第一个参数代表调用这个方法的实例,一般命名为’self’
  3. 实例方法的调用语法:
    实例.实例方法名(调用参数)

    类名.实例方法名(实例, 调用参数)

初始化方法

  1. 作用:
    对新创建的对象添加属性等必须的资源
  2. 语法形式:
 class 类名:
        def __init__(self[,参数列表]):
            语句块
        [] 代表其中内容可省略
  1. 说明:

    1. 初始化方法名必须为init不可改变
    2. 初始化方法会在构造函数创建实例后自动调用,且将实例自身通过第一个参数self传入init方法
    3. 构造函数的实参将通过init方法的参数列表传到init方法中
    4. 初始化方法内如果需要return语句返回,则必须返回None
  2. 示例见:

    
    # 此示例示意初始化方法的定义方法和调用过程
    
    
    class Car:
        """小汽车类"""
        def __init__(self, c, b, m):
            self.color = c  # 颜色
            self.brand = b  # 品牌
            self.model = m  # 型号
            self.wheel = 4
            print("__init__方法被调用")
    
        def run(self, speed):
            print(self.color, '的', self.brand,
                  self.model, '正在以', speed,
                  '公里/小时的速度行驶')
    
        def change_color(self, c):
            self.color = c
    
    a4 = Car('红色', '奥迪', 'A4')
    a4.run(199)
    a4.change_color("白色")
    a4.run(280)
    
    
    x5 = Car('蓝色', '宝马', 'x5')
    x5.run(188)
    
  3. 练习:
    修改之前练习的Student类,为该类添加初始化方法,实现在创建对象时自动添加name,age,score属性

析构方法:

  1. 语法形式:

     class 类名:
            def __del__(self):
                语句块
  2. 作用:
    在对象被销毁之前被调用,主要负责清理对象所占用的资源

  3. 说明:
    python建议尽可能少的在析构方法内做事情,因为销毁时间难以确定

  4. 示例见:

    class FileManage:
        """定义一个文件管理员类"""
        def __init__(self, filename='a.txt'):
            self.file = open(filename, 'w')
    
        def writeline(self, string):
            self.file.write(string)
            self.file.write('\n')
    
        def __del__(self):
            """析构方法会在对象销毁前自动调用"""
            self.file.close()
            print("文件已关闭")
    
    fm = FileManage()
    fm.writeline("hello world")
    fm.writeline("这是中文写的第二行")
    
    del fm
    while True:  # 死循环永远不退出
        pass
    
    print("程序结束")
    

猜你喜欢

转载自blog.csdn.net/luohongtucsdn/article/details/80700974
今日推荐