美文网首页
python基础进阶:详解类的三个重要方法__new__,__i

python基础进阶:详解类的三个重要方法__new__,__i

作者: 孤城暮雨丶 | 来源:发表于2021-01-08 13:46 被阅读0次

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

    本文章来自腾讯云 作者:我是李超人

    私信小编回复01可领取学习资料以及学习视频

    call方法
    首先介绍一下call方法,python中要想一个类的对象能够像函数一样被调用,那这个类需要实现call方法。比如像下面这样:

    class Person(object):
    
        def __call__(self):
            print('__call__')
    
    person = Person()
    person()
    
    

    call方法中也可以传递参数

    class Person(object):
    
        def __call__(self, behavior: str):
            print('__call__: ' + behavior)
    
    person = Person()
    person('hello')
    
    

    call也可以返回值

    class Person(object):
    
        def __call__(self, behavior: str):
            print('__call__: ' + behavior)
            return 'world'
    
    person = Person()
    res = person('hello')
    print(res)
    
    

    其实元类和普通类的call方法没什么区别,都是为了让对象能被调用,普通类的对象被调用很好理解,元类的对象被调用是个什么情况呢?前面说过,元类的对象实际上是类实例(元类是用来创建类),那元类的对象被调用形式上又是怎么样的?是不是就是就是’类()‘这种形式,所以此处的Person()就是元类的对象被调用了,他返回的是一个实例。

    new__和__init
    这两个方法看名字就能知道意思,第一个一定是创建一个对象,第二个就是对对象做初始化用的。元类和普通类这两个方法的作用也是一样的。看下面这个例子:

    class Person(object):
    
        def __new__(cls, *args, **kwargs):
            print('Demo __new__')
            return super(Person, cls).__new__(cls)
    
        def __init__(self, name, age):
            print('Demo __init__')
            self.name = name
            self.age = age
    
        def __call__(self, behavior: str):
            print('Demo __call__ : ' + behavior)
    
    person = Person(name='perter', age=18)
    person('hello')
    
    
    在这里插入图片描述

    元类的完整案例

    class MetaClass(type):
    
        # 第一步
        def __new__(mcs, *args, **kwargs):
            print('MetaClass __new__')
            return super(MetaClass, mcs).__new__(mcs, *args, **kwargs)
    
        # 第二步
        def __init__(cls, *args, **kwargs):
            print('MetaClass __init__')
            super(MetaClass, cls).__init__(*args, **kwargs)
    
        # 第三步
        def __call__(cls, *args, **kwargs):
            print('MetaClass __call__')
            return super(MetaClass, cls).__call__(*args, **kwargs)
    
    class Person(metaclass=MetaClass):
    
        gender = 'man'
    
        # 第四步
        def __new__(cls, *args, **kwargs):
            print('Demo __new__')
            return super(Person, cls).__new__(cls)
    
        # 第五步
        def __init__(self, name, age):
            print('Demo __init__')
            self.name = name
            self.age = age
    
        # 第六步
        def __call__(self, behavior: str):
            print('Demo __call__ : ' + behavior)
    
        def say(self):
            pass
    
    person = Person(name='perter', age=18)
    person('hello')
    
    输出:
    MetaClass __new__
    MetaClass __init__
    MetaClass __call__
    Demo __new__
    Demo __init__
    Demo __call__ : hello
    
    
    在这里插入图片描述

    相关文章

      网友评论

          本文标题:python基础进阶:详解类的三个重要方法__new__,__i

          本文链接:https://www.haomeiwen.com/subject/naffaktx.html