python类的__slots__属性、__del__属性、上下文(__enter__和__exit__)、

常规情况下,类的属性字典是共享的,而实例的字典是独立的。如果一个类的属性较少,但是拥有很多的实例,这些实例的属性字典会占用较多的内存空间。对这样的类来说,为了节省内存空间,可以使用__slots__类变量代替__init__()来存储数据属性。

定义__slots__之后,系统会为实例使用一种更加紧凑的内部表示,即通过一个很小的固定大小的数组来构建,而不是为每一个实例定义一个字典。

__slots__可以是列表、元组、字符串等可迭代对象

定义__slots__之后,类保留有__dict__,但实例没有,取代的是__slots__,且实例不能增加__slots__定义之外的属性。

 

class animal:
    __slots__ = ('name','age')
    def eat(self):
        print('%s is eating'%self.name)

cat=animal()
print(animal.__dict__)#实例还是有__dict__的
# print(cat.__dict__)会报错,实例已经没有__dict__字典了
print(cat.__slots__)  #('name', 'age'),只返回数据属性名称,不返回对应的值
cat.eat()
#cat.sex='male'会报错,不能为实例增加除了__slots__定义之外的属性了

 

 

__del__析构函数,在实例被删除、或者整个python文件执行完毕后自动执行,释放空间。

class test:
    def __init__(self,name):
        self.name=name
    def __del__(self):
        print('我执行啦')

test1=test('haha')
del test1.name
print('------------')
# ------------
# 我执行啦
class test:
    def __init__(self,name):
        self.name=name
    def __del__(self):
        print('我执行啦')

test1=test('haha')
del test1
print('------------')
# 我执行啦
# ------------
class test:
    def __init__(self,name):
        self.name=name
    def __del__(self):
        print('我执行啦')

test1=test('haha')
print('------------')
# ------------
# 我执行啦

 

 

__enter__和__exit__

在通过类()对类实例化时,触发类的__enter__方法,操作错误或完毕触发__exit__方法

 

 

描述符:在一个类中,定义一个类属性为另一个类的实例,如下在B类中定义类属性x值为A的实例,则A类为描述符。

描述符中可定义__get__方法,获取值时触发,__set__方法,设置值时触发,__delete__删除值时触发。

如果A类中实现了__get__和__set__方法,那么A为数据描述符,如果没有实现__set__方法则为非数据描述符。

class A:
    pass
class B:
    x=A()

优先级:类属性>数据描述符>实例属性>非数据描述符>找不到

 

转载于:https://www.cnblogs.com/Forever77/p/10100066.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值