平时工作中,能用到的类基本都是可变的,无论是实例的属性,还是类的属性,也正是因为这样,所以python也是一个“鸭子类型”的编程语言。
今天给大家看看python类的不同面,“不可变”
首先先来看下普通的类,我们都是怎么操作的
>>> class A:
... pass
...
>>> a = A()
>>> a.abc
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'A' object has no attribute 'abc'
>>> a.abc = 1
>>> a.abc
1
上面这段代码很简单,对于你来说一定也不陌生,在我们需要的时候动态的添加属性,这也是我们用python很爽的地方。
那么这个时候,如果这个类是个关键类,或者只是个只读类,如何才能组织这些动态的,不受控制的添加呢?
>>> class B:
... __slots__ = ['papapa']
...
... def __init__(self, papapa):
... super().__setattr__('papapa', papapa)
...
... def __setattr__(self, name, value):
... raise AttributeError(f'{self.__class__} has no attribute {name}')
...
>>> b = B('fanbingbing')
>>> b.papapa
'fanbingbing'
>>> b.papapa = 'linzhiling'
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 8, in __setattr__
AttributeError: <class 'B'> has no attribute papapa
>>> b.__dict__
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'B' object has no attribute '__dict__'
>>> b.abc = 123
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 8, in __setattr__
AttributeError: <class 'B'> has no attribute abc
这里的关键点有2个:
如果对__slots__属性不理解的同学,推荐大家一个去处:
https://stackoverflow.com/questions/472000/usage-of-slots
写的很好。
如果你对今天的内容还感兴趣的话,何不点个赞再走呢?如果感兴趣到想赞赏我,就不要犹豫啦~