• 面向对象之类与对象


    一、类与对象的概念

      类即是类别、种类的意思,是面向对象最重要的概念,在上一篇文章里我已经论述了,对象就是特征和技能的结合体,而类是一系列对象相似的特征与技能的结合体。现实世界中,是先有对象才有类的,而在我们面向对象编程的过程中却是不同的,我们必须先定义类,才能用类去产生(实例化)对象,这一点是最主要的区别。

    二、定义类

      1、现实世界中,先有对象,再有类。

    对象1 
        特征
            职业:学生
            姓名:王二
            性别:男
            年龄:22
        技能
            学习
            打游戏
    对象2
        特征 
            职业:学生
            姓名:张三
            性别:男
            年龄:20
        技能
            学习
            打游戏
            看书
    对象3 
        特征 
            职业:学生
            姓名:婉婉
            性别:女
            年龄:18
        技能
            学习
            打游戏
            看书
    现实中的类:
        特征:
            职业:学生
        技能:
            学习
            打游戏
            看书
    View Code

      2、在面向对象编程的程序中,必须先定义类,才能实例化产生对象。

    # 先有类
    class School_learn:
        job = 'student'
        def study(self):
            print('study hard!')
        def play_game(self):
            print('play games as little as you can')
        def read(self):
            print('read books more and more')
    
    # 再调用类产生对象
    student1 = School_learn() # 通过类的实例化产生对象,等同于School_learn(student1),自动传参
    student2 = School_learn()
    student3 = School_learn()
    print(student1) # <__main__.School_learn object at 0x000002B70F8D7588> 对象
    print(student2)
    print(student3)

      注意:<1>在Python程序中类用class关键字定义,类名首字母习惯一般大写,在程序中,特征用变量标识,技能用函数标识,所以在类中最常见的操作就是变量和函数的定义。

         <2>类中定义的代码,在类定义阶段便会执行,因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过School_learn.__dict__查看。

         <3>类中定义的名字,都是类的属性,用 类名+“ .”+ 属性名可以访问属性。

         <4>对于类,有两种分类,一种是经典类,另一个是新式类,经典类可以通过该字典操作类名称空间的名字,但新式类有限制,这个暂时我们不讨论,后面会再区分。

    三、类的使用

      1、查看类的名称空间和类属性的增删改查

    #!/usr/bin/env python3
    #-*- coding:utf-8 -*-
    
    class School_student:
        job = 'student' # 数据属性
        def student(self):
            print('student hard')
        def games(self): # 函数属性
            print('playing game')
        def read(self): # 函数属性
            print('read books')
        print('hello') # hello
    
    # 查看类的名称空间
    print(School_student.__dict__)
    print(School_student.__dict__['job']) # student
    print(School_student.__dict__['games']) # <function School_student.games at 0x000001CA24978B70>
    
    # 类的查看
    print(School_student.job) # student
    print(School_student.games) # <function School_student.games at 0x0000020072358B70>
    
    # 类属性增加
    School_student.county = 'China' # 默认添加到最后以键值对  'county': 'China'
    print(School_student.__dict__)
    
    # 类属性的更改
    School_student.job = 'STUDENT'
    print(School_student.job)  # STUDENT
    
    # 类属性的删除
    del School_student.county # 删除键值对  'county': 'China'
    print(School_student.__dict__)

      2、调用类,即实例化,得到对象

    student1 = School_learn()
    student2= School_learn()
    student3 = School_learn()

      3、__init__方法

    class School_learn:
        job = 'student'
        def __init__(self,name,age,sex):
            '''
            # 添加对象独有的属性
             #    self:student1
            :param name: '小明'
            :param age: 20
            :param sex: '男'
            '''
            self.Name = name   # student1.Name = '小明'
            self.Age = age      # student1.Age = 20
            self.Sex = sex      # student1.Sex = '男'
    
    # 再调用类产生对象
    student1 = School_learn('小明',20,'')  # 实例化,此处相当于传了四个值:student1,'小明',20,'男'
    print(student1.__dict__) # {'Name': '小明', 'Age': 20, 'Sex': '男'}

      注意:<1> __init__方法是在对象产生之后才会执行,只用来为对象进行初始化操作,不能有返回值。

         <2> 加上__init__方法后,实际的实例化过程分两步:

            first:先产生一个空对象 student1,

            second:触发School_learn.__init__()方法,传递参数 student1,'小明',20,‘男’

    四、对象的使用

      对象属性的增删改查

    #
    student1.Hobby = 'reading'
    print(student1.__dict__) # {'Name': '小明', 'Age': 20, 'Sex': '男', 'Hobby': 'reading'}
    
    #
    del student1.Hobby
    print(student1.__dict__) # {'Name': '小明', 'Age': 20, 'Sex': '男'}
    
    #
    student1.Name = '小华'
    print(student1.__dict__) # {'Name': '小华', 'Age': 20, 'Sex': '男'}
    print(student1.Name) # 小华
    
    #
    print(student1.Sex) #
    print(student1.__dict__)
    
    student2 = School_learn('小敏',19,'')
    print(student2.__dict__) # {'Name': '小敏', 'Age': 19, 'Sex': '女'}
    print(student2.Name) # 小敏

    五、小结

      1、站在不同的角度,我们所定义出的类是完全不同的,每个人的“上帝视角“各有所观,正如一千个人眼中有一千个哈姆莱特一般。

      2、现实中的类与程序中的类并不完全等同,现实世界,先有类,再有对象;程序中,先有类,再有对象。

      3、有时为了编程需要,我们需要定义一些生活中并不存在的类。

  • 相关阅读:
    Redis 是单进程单线程的?
    LeetCode-114. Flatten Binary Tree to Linked List
    Java HashMap源码分析
    转:zookeeper中Watcher和Notifications
    分布式服务框架
    LeetCode-330.Patching Array
    转:String StringBuffer StringBuilder区别
    最小堆代码实现
    数组的各类排序
    两步建立 ssh 反向隧道
  • 原文地址:https://www.cnblogs.com/schut/p/8608594.html
Copyright © 2020-2023  润新知