• 分类/类别
  • 上述的代码(张三,李四,王五,小明):按照学生和老师可以分为两类,而按照学校则可以划分为一类
    • 所以类是抽象的,并不是固定的,是一种思想
  • 类的概念:一系列具有共同特征(属性)或技能(方法)的对象
  • 类的作用:
    • 在现实生活中,是先有对象,再根据对象划分出类,但在Python中,是先定义类,再实例化对象(根据抽象的类,生成具体的对象)
  • 类的定义:
    • class 类名(使用大驼峰):

      • 特征(属性)
      • 技能(方法)

定义类和对象

  1. # 造函数
  2. def f1():
  3. # 1/0 # 不报错,函数定义阶段只检验语法,不执行代码
  4. school = 'a中'
  5. # 造类(经典类,新式类)
  6. class Student: #不要写小括号,小括号是继承
  7. # 1/0 # 报错,类的定义阶段会运行代码
  8. school = 'a中'
  9. def eat(self):
  10. print('吃饭')
  11. print(Student.__name__) # 打印类名
  12. student_dict = Student.__dict__ # 双下划线开头的方法会在某种情况下自动触发
  13. print(student_dict)
  14. print(student_dict['school'])
  15. student_dict['eat'](111)
  1. Student
  2. {'__module__': '__main__', 'school': 'a中', 'eat': <function Student.eat at 0x0000022334A4E8C8>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
  3. a
  4. 吃饭

实例化:

  1. # 造对象(实例化对象)
  2. stu1 = Student()
  3. print(1, stu.school)
  4. print(stu1.__class__) # 也可以通过这个方法来修改这个对象所绑定的类
  5. stu2 = Student()
  6. print(2, stu2.school)
  7. print(stu2.__class__)
  1. 1 a
  2. <class '__main__.Student'>
  3. 2 a
  4. <class '__main__.Student'>

__dict__ 和__class__

  1. 类和对象中的属性,都是存放在__dict__中
  2. 对象的__dict__可以直接进行修改,如stu1.__dict__ = {'num': 1,'name': '张三'}但是类的__dict__属性是只读的,不能进行修改
  3. __class__可以用来查看对象所绑定的类,也可以通过它来进行修改绑定在哪个类上

创建对象时的底层运作

定义对象独有的特征

  1. print(Student.__dict__)
  2. print('stu1', stu1.__dict__)
  3. # 以下两种定义方式等价
  4. # stu1.__dict__['num'] = 1 # 使用字典的方法
  5. stu1.num = 1 # 使用对象的方法
  6. print(stu1.__dict__)
  7. print(Student.__dict__)
  1. {'__module__': '__main__', 'school': 'a中', 'eat': <function Student.eat at 0x00000236C327E8C8>.......}
  2. stu1 {}
  3. {'num': 1}
  4. {'__module__': '__main__', 'school': 'a中', 'eat': <function Student.eat at 0x00000236C327E8C8>.......}

对象的方法是独有的,且对类没有影响

  1. class Student:
  2. school = 'a中'
  3. count = 0
  4. stu1 = Student()
  5. stu1.count += 1
  6. stu2 = Student()
  7. stu2.count +=1
  8. stu3 = Student()
  9. stu3.count += 1
  10. print(Student.count)
  1. 0 # 加的都是对象中的,并没有影响到类

给对象添加属性

  1. # 把特征(特征)都加上去
  2. stu1.name = '张三'
  3. stu1.age = 19
  4. print(stu1.num, stu1.name, stu1.age)
  5. # 李四的特征
  6. stu2.num = 2
  7. stu2.name = '李四'
  8. stu2.age = 20
  9. print(stu2.num, stu2.name, stu2.age)
  10. # 这样加太繁琐了,如果对象多会很麻烦
  1. 1 张三 19
  2. 2 李四 20

init

  1. # 用一个函数把这个重复定义的过程封装起来
  2. def init(obj, num, name, age):
  3. obj.num = num
  4. obj.name = name
  5. obj.age = age
  6. # 和上面的代码效果等价
  7. init(stu1, 1, '张三', 19)
  8. init(stu2, 2, '李四', 20)
  9. print(stu1.__dict__)
  10. print(stu2.__dict__)
  1. {'num': 1, 'name': '张三', 'age': 19}
  2. {'num': 2, 'name': '李四', 'age': 20}
  • 那么我们把这个init函数写到类里去
  • 每次实例化对象的时候都会自动调用__init__方法,且优先级最高
  1. class Student:
  2. school = 'a中'
  3. count = 0
  4. # self就是实例化的对象,是约定俗成的写法,和上面的obj是一样的, __init__在实例化的时候会自动传值
  5. def __init__(self, num, name, age): # self = stu1 self = stu2
  6. self.num = num
  7. self.name = name
  8. self.age = age
  9. Student.count += 1
  10. def ear(self):
  11. print('吃饭')
  12. stu1 = Student(1, '张三', 19) # 每次实例化对象的时候都会自动调用
  13. print(stu1.num, stu1.name, stu1.age)
  14. stu2 = Student(2, '李四', 20)
  15. print(stu2.num, stu2.name, stu2.age)
  16. print(Student.count)
  1. 1 张三 19
  2. 2 李四 20
  3. 2 # 每次实例化的时候都自动运行了init中的代码

_slots_(了解)

  • 限制该类实例化的对象中可添加的属性
  1. class Student:
  2. __slots__ = ['num'] # 只能添加num
  3. pass
  4. stu1 = Student()
  5. stu1.num = 1 # 添加成功
  6. stu1.name = '张三' # 报错

给对象添加属性时的底层运作

day34-2 类和对象(重点)的更多相关文章

  1. JS划重点——类和对象的不正经阐述

    JS划重点--类和对象的不正经阐述 /在JS 类里面函数也是一个对象,那么要创建一个对象就需要一个类,这个类可以由这个对牛逼的对象-函数来实现/ /首先是普罗大众都会的 工厂模式来创建一类/ func ...

  2. 02OC的类和对象

    这章重点介绍OC的类以及对象,由于C语言是面向过程语言,而OC只是对于C语言多了一些面向对象的特性,所以OC相对于其他面向对象语言,例如C#.Java等没有那么多的语法特性,所以差别还是比较大的. 一 ...

  3. JAVA编程中的类和对象

    1:初学JAVA,都知道JAVA是面向对象的编程.笔者这节开始说说类和对象.(实例仅供参考,如若复制粘贴记得修改包名和类名,避免出错) 学习JAVA的快捷键,Alt+/代码补全功能,其实此快捷键启动了 ...

  4. java总结第三次//类和对象2、3

    四.类和对象2 主要内容:Java类的继承.方法的重写.覆盖.访问控制.super 关键字.多态性及其应用 1.继承 要求:Java只支持单继承,不允许多重继承 一个子类只能有一个父类 一个父类可以派 ...

  5. ios开发之OC基础-类和对象

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  6. JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等

    一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ...

  7. oc语言学习之基础知识点介绍(二):类和对象的进一步介绍

    一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造 ...

  8. C++中的类和对象(二)

    一,对象的动态建立和释放 1.什么是对象的动态建立和释放 通常我们创建的对象都是由C++编译器为我们在栈内存中创建的,我们无法对其进行生命周期的管理.所以我们需要动态的去建立该对象,因此我们需要在堆内 ...

  9. c#入门系列——类和对象的代码实现

    面向对象 说起面向对象,大家因该都听说过,也知道是一个编程的方法,简称oop技术.它将对象的算法和数据结构看作一个整体,而一个程序就是由多个对象结合的整体.这样做可以提高代码的复用率,提高了软件的可维 ...

随机推荐

  1. 运维系列之一 Linux的文件与目录权限解析

    在Linux中,万事万物皆文件,普通文件是文件,目录是文件,硬件设备也是文件,因此学习了解Linux中的文件非常重要. Linux中有三种文件类型: (1) 普通文件:又分为文本文件和二进制文件 (2 ...

  2. hdu_1038_Biker's Trip Odometer_201311021643

    Biker's Trip Odometer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  3. Spring MVC-控制器(Controller)-可参数化视图控制器(Parameterizable View Controller )示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_parameterizableviewcontroller.htm 说明:示例基于 ...

  4. 泛型和面向对象C++

    1. 在类内部定义的函数默觉得inline,内联函数应该在头文件里定义,由于其定义对编译器必须是可见的,以便编译器可以在调用点内联展开该函数的代码. 此时,仅有函数原型是不够的. 2.assert 3 ...

  5. 《CS:APP》 chapter 9 Vitrual Memory 笔记

    Vitrual Memory In order to manage memory more efficiently and with fewer errors, modern systems prov ...

  6. HashMap源代码剖析

    大部分思路都是一样的 .仅仅是一些细节不一样.源代码中都标了出来.jdk容器源代码还是挺简单的. public class HashMap<K,V> extends AbstractMap ...

  7. 简化bigdecimal计算的小工具类

    简化bigdecimal计算的小工具类 如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果( ...

  8. 【HDU 6162】 Ch’s gift

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6162 [算法] 离线树剖 我们知道,u到v路径上权值为[A,B]的数的和 = u到v路径上权值小于 ...

  9. Hardwood Species(map)

    http://poj.org/problem?id=2418 题意:给定一系列字符串,要求按字典序升序输出每个串,并输出每个串出现的百分比. 用map做的,交c++A了,G++ WA..so sad. ...

  10. [Apple开发者帐户帮助]三、创建证书(6)创建创建VoIP服务证书

    VoIP:基于IP的语音传输(英语:Voice over Internet Protocol,缩写为VoIP)是一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议,也就是经由互联网来进行 ...