面向对象重点面试题
1、mro是什么?
"""
mro 全称Method Resolution Order,也就是方法解析顺序
方法调用时会对当前类和基类进行搜索用来确定方法所在的位置。而搜索的顺序也就是所谓的方法解析的顺序
"""
2、广度优先深度优先
"""
多继承情况下造成 “钻石继承”
mro的查找顺序:
- 新式类:
- 广度优先
- 经典类:
- 深度优先
-新式类:广度优先
-经典类:深度优先
"""
3、列举面向对象中你苏知道的带双下划线的魔法方法
"""
__new__:在__init__触发前,自动触发
__init__:在调用类时自动执行
__getattr__:在“对象.属性”获取属性时,若“属性没有”时触发
__getattribute__:在“对象.属性”获取属性时,无论“属性有没有”都会触发
__setattr__:当对象.属性=属性值 ,添加或修改属性时触发
__call__:在调用对象即 “对象+()”时触发
"""
4、实现一个singleton单例类,尽可能写多个方法(重要)
"""
单例:单例主要是为了解决 当我们确定"类中的属性与方法"不变时,反复调用该类,产生不同的对象,会产生不同的内存地址,会造成资源浪费。
那单类就是让所有类在实例化时,都指向同一个内存地址
方式1、__new__
class Singleton:
__instance = None
def __new__(cls,*args,**kwargs):
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
obj1 = Singleton()
obj2 = Singleton()
方式2、classmethod
class Singleton:
__instance = None
@classmethod
def singleton(cls):
if not cls.__instance:
cls.__instance = cls()
return cls.__instance
obj1 = Singleton.singleton()
obj2 = Singleton.singleton()
方式3、装饰器
def singleton(cls):
__instance = {}
def inner(*args, **kwargs):
if cls not in __instance:
obj = cls(*args, **kwargs)
__instance[cls] = obj
return __instance[cls]
return inner
@singleton
class Func:
pass
print(Func())
print(Func())
方式4、导入
先定义一个名为singleton的py文件
class Singleton:
pass
obj = Singleton()
# 导入
from signleton import obj
print(obj)
from signleton import obj
print(obj)
"""
5、with上下文管理器
"""
with语句会在代码执行之后,无论我们的代码以何种方式结束的,都可以自动的帮我们关闭文件
那这样做的好处是:如果你嵌套的代码中发生异常,它能够在异常前关闭文件,如果你嵌套的代码中有return/break等语句,也可以帮我们关闭文件
自定义上下文管理器:
得实现__enter__()和__exit__()方法
__enter__():进入上下文管理器时运行
_exit__():退出我们之前上下文管理器中运行的上下文,返回一个一个布尔值
"""
6、面向对象三大特性
"""
封装,继承,多态
封装:封装指定是把一堆属性和方法放在一个容器中,这个容器就是对象,让对象可以通过.的方式来调用对象的属性和方法
继承:继承指的是子类可以继承父类的属性与方法,并且也可以对其进行修改与使用
多态:多态也称之为多态性,其目的就是在在不知道对象具体类型的情况下,让多种类具备类似的向属性与方法,统一对象调用方法的规范
多态有三种表现形式:继续父类,继承抽象类,鸭子类型
"""
Only you can control your future
You're not alone. You still have family,peopel who care for you and want to save you.