第一题,对象的类属性指向类对象
我们看一下
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()
第四题 ,列表解析式
生成列表
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