day34-2 类和对象(重点)
类
- 分类/类别
- 上述的代码(张三,李四,王五,小明):按照学生和老师可以分为两类,而按照学校则可以划分为一类
- 所以类是抽象的,并不是固定的,是一种思想
- 类的概念:一系列具有共同特征(属性)或技能(方法)的对象
- 类的作用:
- 在现实生活中,是先有对象,再根据对象划分出类,但在Python中,是先定义类,再实例化对象(根据抽象的类,生成具体的对象)
- 类的定义:
- class 类名(使用大驼峰):
- 特征(属性)
- 技能(方法)
- class 类名(使用大驼峰):
定义类和对象
# 造函数
def f1():
# 1/0 # 不报错,函数定义阶段只检验语法,不执行代码
school = 'a中'
# 造类(经典类,新式类)
class Student: #不要写小括号,小括号是继承
# 1/0 # 报错,类的定义阶段会运行代码
school = 'a中'
def eat(self):
print('吃饭')
print(Student.__name__) # 打印类名
student_dict = Student.__dict__ # 双下划线开头的方法会在某种情况下自动触发
print(student_dict)
print(student_dict['school'])
student_dict['eat'](111)
Student
{'__module__': '__main__', 'school': 'a中', 'eat': <function Student.eat at 0x0000022334A4E8C8>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
a中
吃饭
实例化:
# 造对象(实例化对象)
stu1 = Student()
print(1, stu.school)
print(stu1.__class__) # 也可以通过这个方法来修改这个对象所绑定的类
stu2 = Student()
print(2, stu2.school)
print(stu2.__class__)
1 a中
<class '__main__.Student'>
2 a中
<class '__main__.Student'>
__dict__ 和__class__
- 类和对象中的属性,都是存放在__dict__中
- 对象的__dict__可以直接进行修改,如
stu1.__dict__ = {'num': 1,'name': '张三'}但是类的__dict__属性是只读的,不能进行修改 - __class__可以用来查看对象所绑定的类,也可以通过它来进行修改绑定在哪个类上
创建对象时的底层运作

定义对象独有的特征
print(Student.__dict__)
print('stu1', stu1.__dict__)
# 以下两种定义方式等价
# stu1.__dict__['num'] = 1 # 使用字典的方法
stu1.num = 1 # 使用对象的方法
print(stu1.__dict__)
print(Student.__dict__)
{'__module__': '__main__', 'school': 'a中', 'eat': <function Student.eat at 0x00000236C327E8C8>.......}
stu1 {}
{'num': 1}
{'__module__': '__main__', 'school': 'a中', 'eat': <function Student.eat at 0x00000236C327E8C8>.......}
对象的方法是独有的,且对类没有影响
class Student:
school = 'a中'
count = 0
stu1 = Student()
stu1.count += 1
stu2 = Student()
stu2.count +=1
stu3 = Student()
stu3.count += 1
print(Student.count)
0 # 加的都是对象中的,并没有影响到类
给对象添加属性
# 把特征(特征)都加上去
stu1.name = '张三'
stu1.age = 19
print(stu1.num, stu1.name, stu1.age)
# 李四的特征
stu2.num = 2
stu2.name = '李四'
stu2.age = 20
print(stu2.num, stu2.name, stu2.age)
# 这样加太繁琐了,如果对象多会很麻烦
1 张三 19
2 李四 20
init
# 用一个函数把这个重复定义的过程封装起来
def init(obj, num, name, age):
obj.num = num
obj.name = name
obj.age = age
# 和上面的代码效果等价
init(stu1, 1, '张三', 19)
init(stu2, 2, '李四', 20)
print(stu1.__dict__)
print(stu2.__dict__)
{'num': 1, 'name': '张三', 'age': 19}
{'num': 2, 'name': '李四', 'age': 20}
- 那么我们把这个init函数写到类里去
- 每次实例化对象的时候都会自动调用__init__方法,且优先级最高
class Student:
school = 'a中'
count = 0
# self就是实例化的对象,是约定俗成的写法,和上面的obj是一样的, __init__在实例化的时候会自动传值
def __init__(self, num, name, age): # self = stu1 self = stu2
self.num = num
self.name = name
self.age = age
Student.count += 1
def ear(self):
print('吃饭')
stu1 = Student(1, '张三', 19) # 每次实例化对象的时候都会自动调用
print(stu1.num, stu1.name, stu1.age)
stu2 = Student(2, '李四', 20)
print(stu2.num, stu2.name, stu2.age)
print(Student.count)
1 张三 19
2 李四 20
2 # 每次实例化的时候都自动运行了init中的代码
_slots_(了解)
- 限制该类实例化的对象中可添加的属性
class Student:
__slots__ = ['num'] # 只能添加num
pass
stu1 = Student()
stu1.num = 1 # 添加成功
stu1.name = '张三' # 报错
给对象添加属性时的底层运作

day34-2 类和对象(重点)的更多相关文章
- JS划重点——类和对象的不正经阐述
JS划重点--类和对象的不正经阐述 /在JS 类里面函数也是一个对象,那么要创建一个对象就需要一个类,这个类可以由这个对牛逼的对象-函数来实现/ /首先是普罗大众都会的 工厂模式来创建一类/ func ...
- 02OC的类和对象
这章重点介绍OC的类以及对象,由于C语言是面向过程语言,而OC只是对于C语言多了一些面向对象的特性,所以OC相对于其他面向对象语言,例如C#.Java等没有那么多的语法特性,所以差别还是比较大的. 一 ...
- JAVA编程中的类和对象
1:初学JAVA,都知道JAVA是面向对象的编程.笔者这节开始说说类和对象.(实例仅供参考,如若复制粘贴记得修改包名和类名,避免出错) 学习JAVA的快捷键,Alt+/代码补全功能,其实此快捷键启动了 ...
- java总结第三次//类和对象2、3
四.类和对象2 主要内容:Java类的继承.方法的重写.覆盖.访问控制.super 关键字.多态性及其应用 1.继承 要求:Java只支持单继承,不允许多重继承 一个子类只能有一个父类 一个父类可以派 ...
- ios开发之OC基础-类和对象
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- JavaSE——面向对象与面向过程、类与对象、(属性、方法、构造器)等
一:面向对象与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程: 1.面向过程思想强调的是过程(动作). 2.在面向过程的开发中,其实就是面向着具体的每一个步骤和过程,把每一个步 ...
- oc语言学习之基础知识点介绍(二):类和对象的进一步介绍
一.类.对象在内存中的存储 /* 内存分区: 栈:局部变量 堆:程序员自己写代码申请开辟的 程序员自己维护,编译器现在帮我们自动优化了,它在合适的给我们加上了释放空间的语句,所以我们现在写的对象不会造 ...
- C++中的类和对象(二)
一,对象的动态建立和释放 1.什么是对象的动态建立和释放 通常我们创建的对象都是由C++编译器为我们在栈内存中创建的,我们无法对其进行生命周期的管理.所以我们需要动态的去建立该对象,因此我们需要在堆内 ...
- c#入门系列——类和对象的代码实现
面向对象 说起面向对象,大家因该都听说过,也知道是一个编程的方法,简称oop技术.它将对象的算法和数据结构看作一个整体,而一个程序就是由多个对象结合的整体.这样做可以提高代码的复用率,提高了软件的可维 ...
随机推荐
- 浅析gcc、arm-linux-gcc和arm-elf-gcc关系
浅析gcc.arm-linux-gcc和arm-elf-gcc关系 一.GCC简介 The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是 ...
- nyoj_289_苹果_20140307
苹果 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. ...
- POJ 1128 Frame Stacking(拓扑排序·打印字典序)
题意 给你一些矩形框堆叠后的鸟瞰图 推断这些矩形框的堆叠顺序 每一个矩形框满足每边都至少有一个点可见 输入保证至少有一个解 按字典序输出全部可行解 和上一题有点像 仅仅是这个要打印全部的可行 ...
- Candy [leetcode] O(n)时间复杂度,O(1)空间复杂度的方法
对于ratings[i+1],和ratings[i]的关系有下面几种: 1. 相等.相等时ratings[i+1]相应的糖果数为1 2.ratings[i + 1] > ratings[i].在 ...
- 我们的一个已投产项目的高可用数据库实战 - mongo 副本集的搭建具体过程
我们的 mongo 副本集有三台 mongo 服务器:一台主库两台从库. 主库进行写操作,两台从库进行读操作(至于某次读操作到底路由给了哪台,仲裁决定).实现了读写分离.这还不止,假设主库宕掉,还能实 ...
- 源代码管理之Git命令的使用
目录 02.源代码管理之Git命令的使用 2.Git命令行演练-个人开发 2.1 如何学习git指令 2.2 初始化创建本地仓库 2.3 个人开发基本演练 2.4 Git的基本常识 3.Git命令行演 ...
- android recovery 系统代码分析 -- 选择进入【转】
本文转载自:http://blog.csdn.net/andyhuabing/article/details/9226569 最近做Recovery的规范及操作指导文档,花了一些时间将流程搞清. An ...
- ES transport client批量导入
从bulk.txt文件中按行读取,然后bulk导入.首先通过调用client.prepareBulk()实例化一个BulkRequestBuilder对象,调用BulkRequestBuilder对象 ...
- IntelliJ IDEA :解决idea导入项目爆红
转:https://my.oschina.net/LevelCoder/blog/1802158 我们在导入一个新的项目到idea的时候,项目明明没有报错,但是会出现出了父包属于正常颜色外,其子包都会 ...
- PCB Genesis加二维码 实现方式
使用incam可以很轻松的增加2维码,这里通过另外一种方式玩转二维码的加法, 使用谷歌zxing.dll类库实现,将文字信息转为bitmap点阵后,在Genesis绘制点即可. 一.incam增加二维 ...