天天看点

python十道经典面试题

第一题,对象的类属性指向类对象

我们看一下

obj.__class__ =A                 obj.show()
           

这样就可以直接调用了

第二题、方法对象__call__

class People():                  def __init__(self,length):                      self.__length = length                  def hand(self):                      print('手有 {} 米'.format(self.__length))              a=People(1)              a.hand()  #这样我们是能够完美运行的
           

那么我们不小心 a(10) 这样了,我希望他能够正常运行

这里我们需要用到一个对象方法__call__

class People():              def __init__(self,length):              self.__length = length                          def hand(self):              print('手有 {} 米'.format(self.__length))                  def __call__(self, *args):              return self.hand()              a=People(1)              a()  #这时a() 会找到__call__ 然后运行返回的函数
           

第三题,__new__ 和 __init__

1.init 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。

 2 ,new 通常用于控制生成一个新实例的过程。它是类级别的方法。

__new__ 在__init__ 之前运行

3、 new至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

4 、new必须要有返回值,返回实例化出来的实例,这点在自己实现new时要特别注意,可以return父类new出来的实例,或者直接是object的new出来的实例

class A():              def func(self):              print('A_func')                  def __init__(self):              print('A_init')              ​              class B():              def func(self):              print('B_func')                  def __new__(cls, a):              print('new  ',a)              if a>10:              return super(B,cls).__new__(cls)              return A()                  def __init__(self,a):              print('B_init')              ​              #想想输出结果                      a = A()              b = B(5)              b.func()              b = B(11)              b.func()
           
python十道经典面试题

第四题 ,列表解析式

生成列表

list1 = [1,2,3,4]              ​              #取出list1中大于二的值              list2 =[i for i in list1 if i>2]                 print(list2)
           

生成字典

​              dict1 = {i: i*2 for i in  list1 if i*2 >4 }              print(dict1)
           
dict2 = {i: 'items'+str(i*2) for i in  list1 if i*2 >4 }              print(dict2)
           

第五题,变量域

num = 666              ​              def f1():              num = 888              print(num)              ​              def f2():              print(num)                       print(num)               f1()               print(num)               f2()                  # 666              #888              #666              #666
           

需要在函数中改变变量

我们需要使用global

这只是局部变量和全局变量的变量域

我们继续看一下函数嵌套的变量域

def fun():              num = 0                  def fun1():              num = 1                  def fun2():              print(num)              fun2()              fun1()              fun()              #1              ​
           

在函数嵌套中变量会逐级网上找变量

这样不会存在找不到变量的问题

在fun2()找不到会到fun1()中找

第六题,默认方法,python反射机制,getattr

好吧,我不想让它报错

class A:              def __init__(self,a,b):              self.a = a              self.b = b                  def func(self):                  print('a+b={}'.format(self.a+self.b))                  def __getattr__(self,args):              return self.func  #切记这里不能加() 因为 func()()是不能执行的                  a1 = A(1,2)              a1.fun()              #3
           

__getattr__,hasattr

这是python的反射机制,getattr会接收参数,

然后执行,对应的还有hasattr,大家可以自己深究

第七题,包管理

当 一个包pack里有三个模块,model, model2, model3, 

采用from pack import *

怎样只导入 model model2

添加 __init__.py文件,在文件中加入__all__ = ['model', 'model2'] 

就能实现了

第八题, 函数闭包

#要求,写一个函数,接受一个整数参数N,返回一个函数,函数功能是把,函数的参数和N相乘的结果返回

def f1(N):              def f2(val):              return N*val              return f2