1: new
- 用来开辟地址空间,实例会指向new开辟的空间,在object父类里面
- 需求:不同的实例引用相同的地址空间,把开辟的地址空间变成只有一个地址空间,然后一个地址空间给所有的实例享用
class A:
pass
a= A()
b= A()
print(id(a))
print(id(b)) #查看地址空间,每次开辟一个实例地址都会不一样
2715356985160
2715357014728
class A(object): #默认object基类,
def __new__(cls, *args, **kwargs): #cls类本身,-->A
if not hasattr(cls, 'aa'): #判断A有没有属性, 'aa'属性, A.aa--》添加类属性
cls.aa = super().__new__(cls) # 将父类的new方法---开辟的新地址==赋值给‘aa'属性
return cls.aa
a = A() #未有aa,为True, 创建了aa,
a.name ='xiaoming'
print(id(a))
b= A() #a实例已经创建了aa,,A类所在的地址已经进行了此操作,为false不会执行,直接返回值
b.name='xiaohua'
print(id(b))
print(a.name) #同个空间,已经被b修改,被覆盖,a就是b
2715360053568
2715360053568
xiaohua
2:slots
- 如果我们需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义__slots__变量来进行限定。需要注意的是__slots__的限定只对当前类的对象生效,对子类并不起任何作用
- 可减少内存,python是用字典将对象进行储存(内存消耗大),使用slots告诉python通过集合储存。
class Person(object):
# 限定Person对象只能绑定_name, _age和_gender属性
__slots__ = ('_name', '_age', '_gender')
def __init__(self, name, age):
self._name = name
self._age = age
def main():
person = Person('王大锤', 22)
person._gender = '男'
# AttributeError: 'Person' object has no attribute '_is_gay'
# person._is_gay = True