python中init,new和call魔法方法的作用和区别

在python中,我们在python的类当中会经常遇到__init__,__new__,__call__等魔法方法。那么这三个有什么作用和区别呢?

  1. __new__:在类当中构造实例化对象,并将对象传递给到init,python解释器会提供一个cls。在整个类当中先执行此方法。

1.1__new__:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class B:
    def __new__(cls, *args, **kwargs):
        print("new")
        return super().__new__(cls)
 
    def __init__(self, name):
        print("init")
        self.name = name
 
    def foo(self):
        print("__foo__")
 
b = B('shao')
b.foo()  
# 打印结果:
#  new
#  init
#  __foo__

  上述结果中,很清晰地说明了,执行类B,会先执行new方法,然后才去执行init方法。在应用中,可以通过重写new方法,来实现单例模式:实例化对象只有一个。

1.2实现单例模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A(object):
    _instance = None
 
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance= super().__new__(cls)
        return cls._instance
 
    def __init__(self,name):
        self.name = name
        print("__init__{}".format(self.name))
 
    def foo(self):
        print("__foo__")
 
a = A('bruce')
b = A('bruce')
print(a,id(a))
print(b,id(b))

 

  2.__init__:在类中对实例化对象进行初始化。

2.1__init__:

1
2
3
4
5
6
7
8
9
class C:
    def __init__(self,name):
        self.name = name
 
    def foo(self):
        print('我是{}'.format(self.name))
 
c = C('bruce')
c.foo() <br># 我是bruce

  

  3.__call__:在类中,允许创建可调用的对象(实例)。就是说可以让函数(方法)可以像对象一样被调用。以“对象名()”的形式使用。

3.1__call__:

1
2
3
4
5
6
7
class B:
    def __call__(self, name, add):
        print('{}在调用__call__方法,添加了{}!'.format(name,add))
 
 
b = B()
b('bruce','吃饭'# 实例化对象()   直接调用call方法<br># bruce在调用__call__方法,添加了吃饭!

  上述就是,以上三个魔法方法区别和运用。

 

posted on   一先生94  阅读(209)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示