python------new方法及其他

  • 一、单例模式
  • new与init的区别:
  • __new:创建实例对象时调用的构造方法
  • init:初始化方法,用于设置实例的相关属性
  • python创建实例时,会先调用new构造方法,然后使用init进行实例初始化。
  • 我们可以通过new来影响实例的创建,从而实现单例。
class A(object):
    __instance = None
    def __new__(cls,*args,**kwargs):
        if not cls. __instance:
            cls.__instance = super().__new__(cls,*args,**kwargs)
        return cls.__instance

a = A()
b = A()
print(a == b)
print(id(a) == id(b))

上面代码中,声明了一个私有类变量__instance,当__instance不为None时,代表系统中已有实例,直接返回该实例,若__instance为None时,表示系统中还没有该类实例,则创建新实例并返回。

二、私有化

xx :公开属性

class Test(object):
    def __init__(self):
        #这是一个公开属性
        self.num = 100

from a import *
test = Test()
print(test.num)

_xx :模块内可以访问的属性这个的作用是该属性只能在当前模块中使用,出了模块及不能使用

class Test(object):
    def __init__(self):
        #这是一个模块属性
        self._num = 100

test = Test()
print(test._num)

__xx :通常是类的私有属性

class Test(object):
    def __init__(self):
        #这是一个私有属性
        self.__num = 100
#当前模块中Test类可以访问
  • 三、==和is
>>> a = 1
>>> b = 1.0
>>> a is b
False
>>> a == b
True
>>> id(a)
12777000
>>> id(b)
14986000
>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True
>>> id(a)
12777000
>>>id(b)
12777000

  • 四、深拷贝和浅拷贝
    浅拷贝
    浅拷贝是对于一个对象的顶层拷贝
    通俗的理解是:拷贝了引用,并没有拷贝内容
In [10]: a = [11,22,33]

In [11]: b = a

In [12]: id(a)
Out[12]: 140343572333832

In [13]: id(b)
Out[13]: 140343572333832

In [14]: a[0] = 'aa'

In [15]: a
Out[15]: ['aa', 22, 33]

In [16]: b
Out[16]: ['aa', 22, 33]

当b = a时,实际上是将a列表的内存地址赋值给了b,那么变量a与变量b指向的是同一内存地址!

深拷贝
深拷贝是对于一个对象所有层次的拷贝(递归)

In [17]: import copy

In [18]: c = copy.deepcopy(a)

In [19]: id(a)
Out[19]: 140343572333832

In [20]: id(c)
Out[20]: 140343572336840

In [21]: a
Out[21]: ['aa', 22, 33]

In [22]: c
Out[22]: ['aa', 22, 33]

In [23]: a[0] = 11

In [24]: a
Out[24]: [11, 22, 33]

In [25]: c
Out[25]: ['aa', 22, 33]

  • 深拷贝不仅拷贝引用还拷贝值,所以内存地址不一样!

你可能感兴趣的:(python------new方法及其他)