转自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对象越多,内存消耗越大。