面向对象重点面试题

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、面向对象三大特性

"""
封装,继承,多态

封装:封装指定是把一堆属性和方法放在一个容器中,这个容器就是对象,让对象可以通过.的方式来调用对象的属性和方法

继承:继承指的是子类可以继承父类的属性与方法,并且也可以对其进行修改与使用

多态:多态也称之为多态性,其目的就是在在不知道对象具体类型的情况下,让多种类具备类似的向属性与方法,统一对象调用方法的规范
多态有三种表现形式:继续父类,继承抽象类,鸭子类型
"""
posted @ 2020-04-01 19:58  alen_zhan  阅读(314)  评论(0编辑  收藏  举报
返回顶部