使用__slots__限制实例的属性

本文介绍Python中如何为实例对象添加或修改属性,并通过__slots__限制可添加的属性,包括在类继承中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.给实例化的对象添加新的属性

看下面一段代码,然后给实例化的对象s添加或者修改属性

class Student(object):
    name='china'

s = Student()
s1=Student()

s.name = 'Charles'
s.age=20
print s.name
print s1.name
print s.age

结果:
Charles
china
20

可以看到:实例的属性可以被修改或者添加

2、使用__slots__限制只有指定的属性才可以被实例添加

将可以被实例化的对象修改的属性添加到内置函数__slots__后面的元祖中,表示只有当属性存在于该元祖中时,该属性才可以在对象中被添加,但是不能修改(如果该属性已经存在于类中);

class Student(object):
    __slots__=('name','age')
    # gender='female'
    # name='china'
    # age = 30

s = Student()
s1=Student()
s.name = 'Charles'
s.age=20
print s.name

# print s1.name
print s.age
# s.gender='male'

在上述代码中s/s1能够添加的属性只有name和age,但是,如果name或者age已经存在于Student类中,那么就不能再s/s1中添加了,否则会报属性错误;

 

3、在类的继承中使用__slots__限制实例化对象的属性

创建一个Primary_Student类,继承Student类,然后实例化Primary_Student

class Student(object):
    __slots__=('name','age')

class PrimaryStudent(Student):
    pass
s2 = PrimaryStudent()
s2.name = 'eric'
s2.genger='male'
print s2.name
print s2.genger

上述代码显示正常

如果我们再在子类中定义__slots__方法呢?

class Student(object):
    __slots__=('name','age')

class PrimaryStudent(Student):
    __slots__ = ('gender')
s2 = PrimaryStudent()
s2.name = 'eric'
s2.gender='male'
s2.grade=80
print s2.name
print s2.gender

上述代码在执行到s2.grade=80的时候报属性错误

 

好了,做到这儿,我们就可以总结一下了

1、类的属性(之前有教程叫做字段,只有包含@装饰器property的方法称为属性,这里就统一叫做属性吧),可以被实例化的对象添加新的属性以及修改属性的值;

2、可以使用__slots__方法,实现只有属性存在于该方法后面的元祖中的时候,在可以被对象添加,如果字段不存在于元祖中,那么该属性只能被对象访问;

3、如果在父类中存在__slots__方法,父类中__slots__对属性的限制不会继承到子类中,但是如果子类中也定义了__slots__方法,那么子类的属性的限制就会继承父类的__slots__,并加上子类的__slots__;

 

参考地址:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186739713011a09b63dcbd42cc87f907a778b3ac73000

 

转载于:https://www.cnblogs.com/cqq-20151202/p/6598085.html

内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
<think>好的,我现在需要解释Python中的__slots__,用户之前已经询问过__init__和__new__的区别,现在可能想进一步了解如何优化类或管理属性。首先,我需要回想__slots__的作用,它主要用于限制实例可以添加的属性,并且能节省内存。接下来,我需要整理主要知识点,比如内存优化、属性限制、与普通类的对比等。 用户可能想知道为什么使用__slots__,使用场景,以及注意事项。我需要确保解释清晰,结构合理,可能还要包括代码示例来展示效果。记得之前回答过__init__和__new__,所以可能需要保持一致的格式,比如分点说明、代码块和实际应用场景。 需要注意不要遗漏关键点,比如__slots__如何影响继承,或者无法使用弱引用的情况。同时,避免技术术语过多,用简单的中文解释。可能还需要比较使用__slots__前后的内存占用差异,用示例说明。 另外,用户可能关心使用后的性能提升,比如属性访问速度是否加快,这也是需要提到的。最后,总结适用场景,帮助用户判断何时该使用__slots__。检查是否有错误,比如是否正确处理了继承中的__slots__问题,或者是否提到动态添加属性限制。确保所有信息准确,并且以用户容易理解的方式呈现。</think>在 Python 中,`__slots__` 是一个特殊的类属性,主要用于优化内存占用和控制实例属性。以下是它的核心要点和用法: ```python class User: __slots__ = ('name', 'age') # 明确声明允许的属性 def __init__(self, name, age): self.name = name self.age = age # 普通类对比 class FreeUser: pass ``` **三大核心作用** 1. **内存优化** 通过固定属性存储方式(取消实例的 `__dict__` 字典),可显著减少内存占用: ```python from sys import getsizeof print(getsizeof(User('Alice', 30))) # 典型输出:56 print(getsizeof(FreeUser())) # 典型输出:152(多出近 3 倍) ``` 2. **属性限制** 严格约束实例可拥有的属性: ```python u = User('Bob', 25') u.gender = 'male' # 抛出 AttributeError ``` 3. **加速访问** 通过预定义属性存储结构,提升属性访问速度(约快 20-30%) **实现原理对比表** | 特性 | 普通类(有 `__dict__`) | 使用 `__slots__` 的类 | |-------------------|------------------------|-----------------------| | 动态添加属性 | ✔️ 允许 | ❌ 禁止 | | 内存占用 | 较高 | 较低 | | 属性访问速度 | 较慢 | 较快 | | 继承机制 | 自动继承 | 需显式声明 | **典型使用场景** - 需要创建海量实例(如游戏中的粒子系统) - 严格限制类的属性字段(如数据验证类) - 需要提升高频访问属性的性能 **注意事项** 1. 继承时需要处理 `__slots__` 的合并: ```python class Student(User): __slots__ = ('grade',) # 必须显式声明,否则会恢复 __dict__ # 父类的 __slots__ 自动合并 ``` 2. 不可与以下特性同时使用: - `@property` 装饰器(需要特殊处理) - 弱引用(需额外添加 `__weakref__` 到 `__slots__`) 3. 无法通过 `vars(obj)` 查看属性(因为没有 `__dict__`) **实际应用案例** ```python class Vector3D: __slots__ = ('x', 'y', 'z') def __init__(self, x, y, z): self.x = x self.y = y self.z = z def __add__(self, other): return Vector3D(self.x+other.x, self.y+other.y, self.z+other.z) # 创建百万级实例可节省约 40% 内存 ``` **决策指南** ✅ 推荐使用:固定属性结构 + 大规模实例化场景 ❌ 避免使用:需要动态添加属性 + 使用弱引用等高级特性时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值