面向对象
1.面向对象和面向过程区别?
面向过程是流程化思维,以过程驱动。面向对象是以点带面的思维,以一个个不同的点(对象),连接整个结果。因此如果代码需要修改,只需修改其中的一个点(对象/类),无需全部修改。
2.类与对象的关系?
类与对象的关系: 类是对事物的总结. 抽象的概念. 类⽤来描述对象. 对象是类的实例化的结果. 对象能执⾏哪些⽅法. 都由类来决定. 类中定义了什么. 对象就拥有什么
3.面向对象3大特征及其特点?
3大特征:继承,多态,封装
多态:当获得结果时,不需考虑一个变量或者方法的结果的类型。
4.类中一些名词的解释?
class 类名:
# ⽅法
def __init__(self, 参数1, 参数2....):
# 属性变量
self.属性1 = 参数1
self.属性2 = 参数2
....
# ⽅法
def method(self):
pass
5.属性变量与方法的区别和内存区别?
属性变量分为实例变量(字段)和类变量(静态变量)。实例变量每一个均有唯一的内存地址,类变量共有一个内存地址,因此类变量的修改会被实例化保留。实例变量可覆盖类变量。
方法:1. 成员⽅法(实例⽅法);2. 静态⽅法;3. 类⽅法
(不限制参数)
6.类的属性?
实现用方法描述属性(参数限制,只能有1个self)
7.私有属性和方法?
在变量前加__表示私有。私有内容不会被继承
8.类与类的关系有哪些?
1. 依赖关系
类A可使用类B,但不限制只能使用使用类B。如多态特征
2. 关联关系
关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量
3. 组合关系
一荣皆荣,一损皆损。如人的五脏,人没了,5脏也没了,表现在代码层面的如在类A中生成类B的实例对象
4. 聚合关系
整体挂了,但是个体仍可存活。如电脑挂了,CPU,硬盘换到别的电脑还能用。表现在代码层面如类B实例一个对象,然后在类A中使用。即使类A挂了,类B的对象依然能调用到其他类
5. 继承关系
6. 实现关系
9.类名和对象是可hash,也就是说类名和对象可作为字典的key使用
10.一些常见的私有方法
1. 类名() 会⾃动执⾏__init__()
2. 对象() 会⾃动执⾏__call__()
3. 对象[key] 会⾃动执⾏__getitem__()
4. 对象[key] = value 会⾃动执⾏__setitem__()
5. del 对象[key] 会⾃动执⾏ __delitem__()
6. 对象+对象 会⾃动执⾏ __add__()
7. with 对象 as 变量 会⾃动执⾏__enter__ 和__exit__
8. 打印对象的时候 会⾃动执⾏ __str__
9. ⼲掉可哈希 __hash__ == None 对象就不可哈希了.
11.创建一个对象的过程
⾸先, 在执⾏类名()的时候. 系统会⾃动先执⾏__new__()来开辟内存. 此时新开辟出来的内
存区域是空的. 紧随其后, 系统⾃动调⽤__init__()来完成对象的初始化⼯作. 按照时间轴来算.
1. 加载类
2. 开辟内存(__new__)
3. 初始化(__init__)
4. 使⽤对象⼲xxxxxxxxx
12. isinstance, type, issubclass 区别?
issubclass(xx,yy) 判断xx是不是yy类型下的子类
type(obj):查看obj是由那个类创建的
13.什么叫反射?
通过字符串来动态访问模块中的功能 .
反射, 其实⼀共有4个函数:
1. hasattr(obj, str) 判断obj中是否包含str成员
2. getattr(obj,str) 从obj中获取str成员
3. setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这⾥的value可以是
值, 也可以是函数或者⽅法
4. delattr(obj, str) 把obj中的str成员删除掉
注意, 以上操作都是在内存中进⾏的. 并不会影响你的源代码