python3面试题汇总_基础篇3--【python】面试题汇总

1.python常用魔法函数

__init__():

所有类的超类object,都有一个默认包含pass的__init__()实现,这个函数会在初始化的时候调用__str__():

直接打印对象的实现方法,__str__是被print函数调用的

__unicode__():

在django中,虽然没有定义__str__,但是django会将__unicode__转为了str,当然你调用unicode更加是没有问题的。__call__():

对象通过提供__call__()方法可以模拟函数的行为,如果一个对象提供了该方法,就可以像函数一样使用它__len__():

调用后会调用对象的__len__函数,我们可以为其定制输出__repr__():

函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式,某对象没有适于人阅读的解释形式的话,str() 会返回与repr(),所以print展示的都是str的格式__setarrt__():__new__():__getattr__():__getattribute__():__delattr__():__setitem__():__delitem__():__iter__():

可以使用迭代器访问__del__():

2.如何判断是函数还是方法?

函数:

函数是封装了一些独特功能,可以被直接调用

方法:

方法和函数类似,同样封装了独立的功能,但是方法是需要通过对象来调用的。

3.静态方法和类方法区别?

静态方法不需要传入self参数,类成员方法需要传入代表本类的cls参数

静态方法是无妨访问实例变量和类变量的,类方法无法访问实例变量但是可以访问类变量

4.列举面向对象中的特殊成员以及应用场景

__doc__ 描述类的信息

__call__ 对象后面加括号,触发执行

__dict__查看类或对象中的所有成员

5.什么是反射?以及应用场景?

6.metaclass作用?以及应用场景?

7.用尽量多的方法实现单例模式

1.模块单例

python的模块就是天然的单例模式,模块在首次导入时,会生成.pyc文件,当第二次导入时,就会直接加载.pyc文件,而不会再次执行模块代码classSingleton(object):deffoo(self):passsingleton=Singleton()from foo1 importsingleton2.静态变量

先执行了类的__new__方法,实例化对象,然后再执行类的__init__方法,对这个对象进行初始化,所以我们可以基于这个,实现单例模式classSingleton(object):def __new__(cls,a):if not hasattr(cls, "_instance"):

cls._instance= object.__new__(cls)returncls._instancedef __init__(self,a):

self.a=adefaa(self):print(self.a)

a= Singleton("a")

本质上是手动版的__new__方法3.元类方法

执行元类的__new__方法和__init__方法来实例化类对象,__call__方法用来对实例化的对象的实例也就是累的对象进行控制,__call__方法会调用实例类的__new__方法,用于创建对象。返回对象给__call__方法,然后调用类对象的__init__方法,用于对对象初始化classSingleton1(type):def __init__(self, *args, **kwargs)

self._instance=None

super(Singleton1,self).__init__(*args,**kwargs)def __call__(self,*args,**kwargs):if self._instance isNone:

self.__instance = super(Singleton1,self).__call__(*args,**kwargs)return self.__instance

classSingleton2(type):

_inst={}def __call__(cls, *args, **kwargs):print(cls)if cls not incls._inst:

cls._inst[cls]= super(Singleton2,cls).__call__(*args)returncls._inst[cls]class C(metaclass=Singleton1):pass

4.装饰器

装饰器用来控制类调用__call__方法def singleton(cls,*args,**kwargs)

instance={}def __singleton(args):if cls not ininstance:

instance[cls]= cls(*args,**kwargs)returninstance[cls]return __singleton@singletonclassA:pass

8.装饰器的写法以及应用场景

1.授权

装饰器能有助于检查某个人是否被授权去使用一个web应用的端点。from functools importwrapsdefrequires_auth(f):

@wraps(f)def decorated(*args,**kwargs):

auth=request.authorizationif not auth or notcheck_auth(auth.username,auth.password):

authenticate()return f(*args,**kwargs)returndecorated2.日志

日志是装饰器运用的另一个亮点from functools importwrapsdeflogit(func):

@wraps(func)def with_logging(*args,**kwargs):print(func.__name__ + "was called")return func(*args,**kwargs)returnwith_logging

@logitdefaddition_func(x):"""Do some math"""

return x +xreturn = addition_func(4)3.带参数的装饰器

带参数的装饰器是典型的闭包函数4.在函数中嵌入装饰器from functools importwrapsdef logit(logfile='out.log'):deflogging_decorator(func):

@wraps(func)def wrapped_function(*args,**kwargs):

log_string= func.__name__ + "was called"

print(log_string)

with open(logfile,"a") as opened_file:

opened_file.write(log_string+ '\n')return func(*args,**kwargs)returnwrapped_functionreturnlogging_decorator

@logit()defmyfunc1():passmyfunc1()#Output: myfunc1 was called

#现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串

@logit(logfile='func2.log')defmyfunc2():passmyfunc2()#Output: myfunc2 was called

#现在一个叫做 func2.log 的文件出现了,里面的内容就是上面的字符串

5.装饰器类

9.异常处理写法以及如何主动抛出异常(应用场景)

classMyException(Exception):def __init__(self,msg):

self.msg=msgdef __str__(self):returnself.msgtry:raise MyException("自定义的异常")exceptMyException as e:print(e)finally:print(123)

10.什么是面向对象的mro

1.python多继承

一个类可以继承多个无关的类,一个类可以被多个无关的类继承2.经典类的mro

在经典类中采用的是深度优先遍历方案3.新式类的mro

merge方法class A(O):pass

class B(O):pass

class C(O):pass

class E(A,B):pass

class F(B,C):pass

class G(E,F):passmro(G)= [G] +merge(mro[E], mro[F], [E,F])= [G] +merge([E,A,B,O], [F,B,C,O], [E,F])= [G,E] +merge([A,B,O], [F,B,C,O], [F])= [G,E,A] +merge([B,O], [F,B,C,O], [F])= [G,E,A,F] +merge([B,O], [B,C,O])= [G,E,A,F,B] +merge([O], [C,O])= [G,E,A,F,B,C] +merge([O], [O])=[G,E,A,F,B,C,O]4.super()

super()可以帮我们执行mro下一个父类的方法。通常super()有两个使用的地方1.可以访问父类的构造方法2.当子类方法想调用父类(mro)中的方法

super是查找mro顺序中的下一个

单继承中我们可以认为super是对父类中的属性或方法的引入classInit(object):def __init__(self, v):print("init")

self.val=vclassAdd2(Init):def __init__(self, val):print("Add2")

super(Add2, self).__init__(val)print(self.val)

self.val+= 2

classMult(Init):def __init__(self, val):print("Mult")

super(Mult, self).__init__(val)

self.val*= 5

classHaHa(Init):def __init__(self, val):print("哈哈")

super(HaHa, self).__init__(val)

self.val/= 5

class Pro(Add2,Mult,HaHa): # pass

classIncr(Pro):def __init__(self, val):

super(Incr, self).__init__(val)

self.val+= 1

#Incr Pro Add2 Mult HaHa Init

p = Incr(5)print(p.val)

c= Add2(2)print(c.val)

提示. 先算MRO.然后看清楚self是谁.

结论: 不管super()写在哪儿.在哪儿执行. 一定先找到MRO列表 根据MRO列列表的顺序往下找.否则⼀一切都是错的

11.isinstance作用以及应用场景?

isinstance作用:来判断一个对象是否是一个已知的类型;

12.找到一个数组中两个值得和等于固定值(target)返回这俩值得索引

deftwoSum(self,nums,target):if len(nums) <= 1:returnFalse

buff_dict={}for i inrange(len(nums)):if nums[i] inbuff_dict:return[buff_dict[nums[i]],i]else:

buff_dict[target- nums[i]] = i

13.json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型

自定义时间序列化转换器importjsonfrom json importJSONEncoderfrom datetime importdatetimeclassComplexEncoder(JSONEncoder):defdefault(self,obj):ifisinstance(obj,datetime):return obj.strftime("%Y-%m-%d %H:%M:%S")else:returnsuper(ComplexEncoder,self).dafault(obj)

d= {"name":"zhangw","date":datetime.now()}print(json.dumps(d,cls=ComplexEncoder))

14.json序列化时遇到中文会默认转换成unicode  ,如何让他保留中文形式

importjson

a= json.dumps({"ddf":"你好"},ensure_ascii=False)print(a)

15.什么是断言?应用场景?

python的assert是用来检查一个条件,如果它为真,就不做任何事。如果它为假,则  会抛出AssertError并且包含错误信息

防御型编程

运行时检查程序逻辑

检查约定

程序常量

检查文档

16.有用过with statement吗?它的好处是什么?

with语句的作用是通过某种方法简化异常处理,它是所谓的上下文管理器的一种

with语句会在嵌套的代码执行之后,自动关闭文件

17.使用代码实现查看列举目录下的所有文件

importosdefdirpath(lpath, lfilelist):

list=os.listdir(lpath)for f inlist:

file= os.path.join(lpath, f) #拼接完整的路径

if os.path.isdir(file): #判断如果为文件夹则进行递归遍历

dirpath(file, lfilelist)else:

lfilelist.append(file)returnlfilelist

lfilelist=dirpath(os.getcwd(), [])for f inlfilelist:print(f)

18.简述 yield和yield from关键字

当一个函数中出现yield关键字时,这个函数就是一个生成器,可以用for循环或者next()函数来迭代

yield可以接收到外界传入的变量yield from iterable == for item in iterable:yield item

你可能感兴趣的:(python3面试题汇总)