文章目录


必须放一个表情包,太魔性了!

这几道Python面试题,稳准狠,Python面试题No15_类继承

第1题: 修改以下Python代码,使得下面的代码调用类A的show方法?

原始代码


class A(object):
def run(self):
print("基础 run 方法")

class B(A):
def run(self):
print("衍生 run 方法 ")


obj = B()
obj.run()


面试要点:

类继承,只要通过​​__class__​​方法指定类对象就可以了。

修改代码

class A(object):
def run(self):
print("基础 run 方法")

class B(A):
def run(self):
print("衍生 run 方法 ")


obj = B()
obj.__class__ = A
obj.run()


第2题:修改以下Python代码,使得代码能够运行

原始代码


class A(object):
def __init__(self,a,b):
self.__a = a
self.__b = b

def show(self):
print("a=",self.__a,"b=",self.__b)

a = A(5,10)
a.show()
a(20)


面试要点:

是方法对象,为了能让对象实例能被直接调用,需要实现​​__call__​​方法

修改代码

class A(object):
def __init__(self,a,b):
self.__a = a
self.__b = b

def show(self):
print("a=",self.__a,"b=",self.__b)

def __call__(self, num):
print("call:",num + self.__a)


a = A(5,10)
a.show()
a(20)


第3题: 下面这段代码的输出是什么?

原始代码

class B(object):
def __init__(self):
print("B init")

def run(self):
print("B run func")


class A(object):
def run(self):
print("A run func")

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

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


a1 = A(5)
a1.run()
a2 = A(20)



这个运行需要对代码比较熟悉了

结果如下

# a1 = A(5)
new 5
B init
# a1.run()
new 5
B init
B run func
# a2 = A(20)
new 5
B init
B run func
new 20
init 20


第4题: 下面这段代码输出什么?

原始代码

num  = 9
def fn1():
num = 20

def fn2():
print(num)

fn2() # 9
fn1() # 啥都没有
fn2() # 9


全局变量和局部变量。
num 不是个全局变量,所以每个函数都得到了自己的 num 拷贝,如果你想修改 num ,则必须用 global 关键字声明

第5题:如何添加代码,使得没有定义的方法都调用myfunc方法?

原始代码

class A(object):
def __init__(self,a,b):
self.a1 = a
self.b1 = b
print("初始化方法")

def myfunc(self):
print("myfunc")


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


修改代码

class A(object):
def __init__(self,a,b):
self.a1 = a
self.b1 = b
print("初始化方法")

def myfunc(self):
print("myfunc")

def __getattr__(self, item):
return self.myfunc

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


考点
python的默认方法, 只有当没有定义的方法调用时,才会调用方法 ​​__getattr__​​。
当 fn1 方法传入参数时,我们可以给 myfunc方法增加一个 *args 不定参数来兼容。