一 如何判断一个对象是不是函数类型
#方法一
def func(arg): if callable(arg): print("是函数"+arg()) else: print(arg) func(123) #123 func(lambda : "666") #是函数666
方法二 import types def func(arg): if isinstance(arg,types.FunctionType): print("是函数"+arg()) else: print(arg) func(123) func(lambda : "666")
二 关于__new__方法和 __init__方法
我们知道对一个类加上括号就是实例化一个对象,那么,new和init方法有什么先后吗
1 先看一个简单的例子
class Foo(object): def __init__(self,a1): print(a1) #123 self.a=a1 obj=Foo(123) #123 print(obj) #<__main__.Foo object at 0x00000184FFEC8908>
结果:
123
<__main__.Foo object at 0x00000184FFEC8908>
分析:一个类的实例化首先找到__new__方法,在这里我们没有写,因此它会去找它的父类的__new__方法,它返回的是对象,之后对对象进行构造
2 对 __new__方法进行重写
class Foo(object): def __init__(self,a1): print(a1) #123 self.a=a1 def __new__(cls,*args,**kwargs): # return 'hhhh' pass
结果:None
分析:先执行new方法,这里为空,就返回为None,为其他字符时,返回其他字符,init的方法没有执行
3 重写返回对象
class Foo(object): def __init__(self,a1): print(a1) #123 ---- self.a=a1 def __new__(cls, *args, **kwargs): #根据类创建对象 #执行返回值的构造方法 __init__ print(cls) #<class '__main__.Foo'> --这里先执行,还是类 return object.__new__(cls)
obj=Foo(123)
print(obj) #<__main__.Foo object at 0x0000020899B48908>
结果:
<class '__main__.Foo'>
123
<__main__.Foo object at 0x0000020899B48908>