SPSS+AMOS数据分析案例教程-关于中介模
SPSS视频教程内容目录和跳转链接
Meta分析辅导+代找数据
SPSS+AMOS数据分析案例教程-关于中介模
SPSS视频教程内容目录和跳转链接
R语言快速入门视频教程
Python智联招聘数据分析
LCA潜在类别分析和Mplus应用
Amos结构方程模型数据分析入门教程
倒U关系回归分析中介效应和调节效应分析SPSS视频教程
统计咨询(图文问答)

python3的__new__和__init__方法的比较和使用

在B站@mlln-cn, 我就能回答你的问题奥!

文章目录
  1. 1. new和init的差异
  2. 2. 应用
  3. 3. 参考文献

这篇文章的目的是在python3环境下, 讨论__new____init__方法的用法。

new和init的差异

__new____init__方法都是类的内置方法, 他们的主要区别是: __new__用于对象的创建, 而__init__用于对象的实例化, 所以你可以猜到, __new____init__之前被调用。 所以我们如果想要改变类的创建过程, 可以自定义__new__方法, 比如动态创建对象(对象的类型是可变的)。

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
32
class A:
def __init__(self, name):
self.name = name

class B:
def __init__(self, name):
self.name = name

class C:
def __init__(self, name):
self.name = name

class ABC:
def __new__(klass, *args, **kwargs):
if args[0] == 'A':
return A.__new__(A, *args, **kwargs)
elif args[0] == 'B':
return B.__new__(B, *args, **kwargs)
elif args[0] == 'C':
return C.__new__(C, *args, **kwargs)
else:
print('Befor new')
ins = super(ABC, klass).__new__(klass, **kwargs)
print('After new')
return ins

def __init__(self, name):
print('Hi', name)
self.name = name


ABC('A')
输出(plain):
<__main__.A at 0x22fb59938d0>
1
ABC('B')
输出(plain):
<__main__.B at 0x22fb59671d0>
1
ABC('C')
输出(plain):
<__main__.C at 0x22fb5bfcbe0>

通过上面的例子, 你可能已经发现, __new__的第一个参数是类本身, 而__init__是实例本身。 你需要注意的是, __new__返回的实例不是自己的实例时, __init__方法不会被调用, 而如果返回的是自己的实例时, 就可以被隐性调用:

1
ABC('ABC')
输出(stream):
Befor new
After new
Hi ABC
输出(plain):
<__main__.ABC at 0x22fb5bfd780>

所以, 当返回其他类的实例时, 你需要自己调用__init__方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A:
def __init__(self, name):
print('I am in A')

class ABC:
def __new__(klass, *args, **kwargs):
if args[0] == 'A':
ins = A.__new__(A, *args, **kwargs)
ins.__init__(*args, **kwargs)
return ins
elif args[0] == 'B':
return B.__new__(B, *args, **kwargs)
else:
return C.__new__(C, *args, **kwargs)

def __init__(self, *args, **kwargs):
print('I am in ABC')



ABC('A')
输出(stream):
I am in A
输出(plain):
<__main__.A at 0x22fb59677b8>

应用

我常常在使用单例模式的时候自定义__new__方法, 单例模式的意思就是类只能实例化得到一个实例, 多次实例化返回的还是同一个实例:

1
2
3
4
5
6
7
class Singleton(object):
_instance = None # Keep instance reference

def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance
1
2
3
4
5
6
s1 = Singleton()
s2 = Singleton()
a1 = ABC('A')
a2 = ABC('A')
print('a1 == a2:', a1 == a2)
print('s1 == s2:', s1 == s2)
输出(stream):
I am in A
I am in A
a1 == a2: False
s1 == s2: True

参考文献

注意
本文由jupyter notebook转换而来, 您可以在这里下载notebook
统计咨询请加QQ 2726725926, 微信 mllncn, SPSS统计咨询是收费的
微博上@mlln-cn可以向我免费题问
请记住我的网址: mlln.cn 或者 jupyter.cn

统计咨询

统计咨询请加入我的星球,有问必回

加入星球向我提问(必回),下载资料,数据,软件等

赞助

持续创造有价值的内容, 我需要你的帮助