dawn-liu

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一 如何判断一个对象是不是函数类型

#方法一
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>

 

posted on 2019-05-13 15:22  dawn-liu  阅读(146)  评论(0编辑  收藏  举报