-
闭包是什么现象,有什么应用
- 一个能记住嵌套作用域变量值的函数,尽管作用域已经不存在,即:闭包引用了自由变量,即使生成闭包的环境已经释放,闭包依然存在。
- 闭包的三要素
- 含有嵌套函数
- 嵌套(内嵌)函数引用外部变量
- 嵌套函数被返回
- 应用
- 运行时可以有多个实例,即使传入的参数相同
- 模拟构造类
- 实现偏函数的功能
-
可迭代对象和迭代器、生成器是什么区别
- 可迭代对象
Iterable
,即有迭代能力的对象,实现了魔法函数__iter__
,通常该函数返回一个实现了__next__
方法的对象,当然这个返回不是必须的;迭代器Iterator
同时实现了__iter__
和__next__
。 迭代器是实现了next方法的可迭代对象。调用iter方法可以将可迭代对象变成迭代器
,这个说法不准确,可迭代对象还是可迭代对象,是否为迭代器取决于调用iter()
方法的返回结果。- 生成器都是迭代器,反之不成立。
- 可迭代对象
-
描述符
descriptor
,属性property
,函数(类)装饰器decorator
之间的联系与区别- 描述符是
@property,@classmethod,@staticmethod,super
的底层实现机制 - 一个类如果实现了
__get__, __set__, __del__
方法(不一定全部实现),并且该类的实例对象通常是另一个类的类属性,那么这个类就是一个描述符:即描述符是实现了特定协议的类
- 描述符是
-
对象属性的查询优先级(访问顺序)是什么样子的
- 从上到下依次是:
__getattribute__()
方法 - 类、父类、祖先类的数据描述符(同时定义了
__get__
和__set__
的描述符) - 实例对象的字典
- 类的字典
- 非数据描述符(仅定义了
__get__
的描述符) - 父类的字典
__getattr__()
方法
- 从上到下依次是:
-
如何定义一个只有方法的类
- 设置类的
__slots__
属性为空集合
- 设置类的
-
Python中成员访问控制如何实现
- 私有变量用双下划线开头,不允许访问,因为python中没有对此进行强制限制,依然可以通过
obj._C__foo
的方式访问私有变量 - 保护变量用单下划线开头,不建议访问
- 私有变量用双下划线开头,不允许访问,因为python中没有对此进行强制限制,依然可以通过
-
对象的特殊只读属性有哪些
object.__dict__
:一个字典或其他类型的映射对象,用于存储对象的(可写)属性instance.__class__
:类实例所属的类class.__bases__
:由类对象的基类所组成的元组class.__mro__
:由类组成的元组,在方法解析期间基于此查找基类class.__subclasses__()
:返回一个由仍然存在的所有此类引用组成的列表definition.__name__
:类、函数、方法、描述器或生成器实例的名称