魔术方法

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值