Python面试题集

转自http://www.bugcode.cn/PythonQuestions.html

1、类继承

有如下代码

class A(object):
    def show(eslf):
        print('base show')

class B(A):
    def show(self):
        print('derived show')

obj=B()
obj.show()

如何调用类A的show方法。

#方法1
obj.__class__=A
obj.show()

#方法2
obj=A()
obj.show()

class 方法指向了类对象,只用给它赋值类型A,就可以调用A类的show方法。

2、方法对象

问题:为了让下面这段代码运行,需要增加哪些代码?

class A(object):
    def __init__(self,a,b):
        self.__a=a
        self.__b=b
    def myprint(self):
        print('a= {},b= {}'.format(self.__a,self.__b))

a1=A(10,20)
a1.myprint()

a1(80)

为了能让对象实例能被直接调用,需要实现call方法。

class A(object):
    def __init__(self,a,b):
        self.__a=a
        self.__b=b
    def myprint(self):
        print("a= {},b= {}".format(self.__a,self.__b))
    #实现call方法
    def __call__(self,num):
        print("call: ",num+self.__a+self.__b)

3、new 和init

下面这段代码输出什么?

class B(object):
    def fn(self):
        print('B fn')

    def __init__(self):
        print("B INIT")

class A(object):
    def fn(self):
        print("A fn")

    def __init__(self, a):
        print("INIT ",a)

    def __new__(cls,a):
        print("New ",a)
        if a>10:
            return super(A,cls).__new__(cls)
        return B()

if __name__=='__main__':
    a1=A(5)
    a1.fn()
    
    a2=A(20)
    a2.fn()

结果为:

New  5
B INIT
B fn
New  20
INIT  20
A fn

__init__ 用来初始化实例,为其实例设置属性,init在对象创建后,对对象进行初始化。

__new__ 用来创建实例,在返回的实例上执行__init__,如果不返回实例,那么不执行__init__函数。new是在对象创建之前创建一个对象,并将该对象返回给init。

4、默认方法

如下代码,方法fn1/fn2/fn3 都没有定义,添加代码,是没有定义的方法都调用没有default函数。

class A(object):
    def __init__(self,a,b):
        self.a1=a
        self.b1=b
        print("init")

    def mydefault(self,num):
        print("default:  ",num)

a1=A(10,20)
a1.fn1()
a1.fn2()
a1.fn3()

添加代码:

class A(object):
    def __init__(self,a,b):
        self.a=a
        self.b=b
        print("init")
       
    def mydefault(self):
        print("default")


    def __getattr__(self,name):
         return self.mydefault

a1 = A(10,20)
a1.fn1()
a1.fn2()
a1.fn3()

执行结果为:

init
default
default
default

方法getattr只有当实例调用没有定义的方法时才调用它。当fn1方法传入参数时,可以给default方法增加一个*args不定参数来兼容。

class A(object):
    def __init__(self,a,b):
        self.a=a
        self.b=b
        print("init")
    
    def myfault(self,*args):
        if not args:
            print("default ")
        else:
            print("default, ",str(args[0]))

    def __getattr__(self,item):
        print("ohter fuc: ",item)
        return self.mydefault

a1=A(10,20)
a1.fn1()
a1.fn2(10)
a1.fn3("we are the world")

5、包管理

一个包里有三个模块,mode1.py, mode2.py, mode3.py 但使用from demopack import * 导入模块时,如何保证只有mode1、mode3被

导入了。

在包中增加init.py 文件,并在文件中添加代码:

__all__=['mode1','mode3']

6、闭包

写一个函数,接受整数参数n,返回一个函数,函数的功能是吧函数的参数和n相乘并把结果返回。

def mulby(num):
    print("num:",num)
    
    def gn(val):
        print("val: ",val)
        return val*num
    
    return gn

zw=mulby(25)
print(zw(4))

7、性能

解析下面代码慢在哪里?
def strtest(num):
    str="fisrt"
    for i in range(num):
        str+="x"
    return str

python中的str是个不可变对象,每次迭代都会生成新的str对象来存储新的字符串,num越大,创建的str对象越多,内存消耗越大。

猜你喜欢

转载自blog.csdn.net/qq_24816993/article/details/82111026