Python类中的魔法方法之 __slots__原理解析

yizhihongxing

Python中的类可以定义各种各样的魔法方法,这些魔法方法通过在类中定义特殊的方法名来触发各种运算以及特殊操作。而 __slots__ 就是Python中一个特殊的魔法方法,它可以在定义类时指定一个类成员列表,从而限制实例对象的属性只能为 __slots__ 中所列出的成员名。

1. 为何需要使用 slots

在Python中,类声明时并不需要指定实例的属性名称,而是随着实例的创建动态添加属性。这个特性成为动态语言的一个优势,但在某些情况下会导致不必要的内存浪费和运行效率,特别是当实例的属性非常多的时候。

在这种情况下,我们可以使用 __slots__ 方法来限制实例的属性,从而可以有效地控制内存使用和程序运行效率。

2. slots 原理

在Python中,每个对象都有一个指向其类的指针。当访问一个对象的属性时, Python会首先在对象实例中查找该属性,如果找不到,就会到对象的类中去查找。如果类中也没有这个属性,那么将继续在类的顶层父类中去查找,直到找到该属性或抛出 AttributeError 异常为止。

因此, Python每次在获取属性的时候都需要进行一次属性查找,而这个过程涉及到了多次的字典操作。而使用 slots 可以限制类的实例只能存储预定义的属性名称,从而可以大幅度减少属性查找次数,提高性能。

3. 示例说明

下面我们通过两个示例说明 __slots__ 的使用方法和使用效果。

示例1:使用 slots 限制属性

class Student:
    __slots__ = ['name', 'age', 'gender']

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

s = Student("Tom", 18, "male")
s.score = 90  # 将引发 AttributeError 异常

在上面的例子中,我们定义了一个 Student 类,并在其中使用 slots 属性限制类的实例只能存储属性 nameagegender,试图增加其他属性将会引发 AttributeError 异常。

示例2:实现一个卡牌游戏

我们可以使用 slots 来实现一个具有简单功能的卡牌游戏:

class Card:
    __slots__ = ['rank', 'suit']

    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

class Deck:
    __slots__ = ['cards']

    def __init__(self):
        ranks = [str(n) for n in range(2, 11)] + list('JQKA')
        suits = 'diamonds clubs hearts spades'.split()
        self.cards = [Card(rank, suit) for rank in ranks for suit in suits]

    def shuffle(self):
        import random
        random.shuffle(self.cards)

    def deal(self):
        return self.cards.pop()

deck = Deck()
print(deck.cards)
deck.shuffle()
print(deck.cards)
print(deck.deal())

在上面的例子中,我们定义了两个类, CardDeck,并在其中使用 slots 属性限制了实例的属性。我们通过实现 Deck 来模拟一副扑克牌,并使用 shuffle 方法来洗牌,使用 deal 方法来模拟发牌,其中发牌将会返回一张牌并从牌堆中删除该牌。

这里的例子中使用了 slots 来限制 Card 类的实例只能存储属性 ranksuit,而 Deck 类的实例只能存储属性 cards。这样做可以避免在实例化对象时创建额外的字典,从而提高程序的性能。

以上就是关于 Python 类中的 __slots__ 的原理解析和示例演示。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python类中的魔法方法之 __slots__原理解析 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Raspi 3 PIR 传感器 – Python 脚本 – 语法无效

    【问题标题】:Raspi 3 PIR sensor – Python script – invalid syntaxRaspi 3 PIR 传感器 – Python 脚本 – 语法无效 【发布时间】:2023-04-02 23:15:01 【问题描述】: 实际上我在“魔镜”工作,现在我遇到了一个问题,我的 python 脚本应该打开/关闭我的显示器。 I c…

    Python开发 2023年4月8日
    00
  • python 列表套json字典根据相同的key筛选数据

    当Python列表中嵌套着多个JSON字典,我们要从中筛选出与某个key相同的数据时,可以通过以下步骤操作: 使用json库中的loads()函数将JSON字符串转换为Python字典 遍历Python列表,逐个字典查找目标key并匹配 如果匹配成功,则保存该字典到一个新的列表 下面,我们将通过两个示例详细讲述这个过程。 示例一 假设我们有如下一个Pytho…

    python 2023年6月3日
    00
  • Python3 Tkinter选择路径功能的实现方法

    下面我来详细讲解“Python3 Tkinter选择路径功能的实现方法”的完整攻略。 一、介绍 在开发桌面应用程序时,可能需要用户通过图形界面选择某个文件或路径。Python3自带的图形用户界面(GUI)库Tkinter提供了一些强大的控件,其中就包括了文件选择器(File Dialog)控件,用于选择文件或文件夹路径。本攻略主要讲解如何使用Tkinter选…

    python 2023年6月13日
    00
  • Python如何调用JS文件中的函数

    要调用JS文件中的函数,可以使用Python内部的模块execjs,该模块可以执行内嵌的JS代码、从文件读取JS代码并执行。下面是详细的步骤: 步骤1:安装execjs模块 在命令行输入以下命令可以安装execjs模块: pip install execjs 步骤2:创建JS函数文件 在本地创建JS函数文件,并编写需要调用的JS函数,例如example.js…

    python 2023年6月3日
    00
  • python实习总结(yeild,async,azwait和协程)

    Python实习总结 本文将介绍在Python实习中所了解到的yield、async、await和协程的知识点以及如何使用它们。 yield和生成器 yield是一种特殊的关键字,它可以让函数暂停执行,并将函数的当前状态保持下来。yield常用于生成器中,生成器可以用来迭代一组数据,而不用事先生成整组数据,这样可以节省内存空间。以下是yield的示例代码: …

    python 2023年5月13日
    00
  • pip报错“ValueError: invalid literal for int() with base 10: ‘2.0’”怎么处理?

    当使用pip安装Python包时,可能会遇到“ValueError: invalid literal for int() with base 10: ‘2.0’”错误。这个错误通常是由以下原因之一引起的: 包版本号格式不正确:如果包版本号格式不正确,则可能会出现此错误。在这种情况下,需要更改包版本号格式。 pip版本过低:如果pip版本过低,则可能会出此错误…

    python 2023年5月4日
    00
  • Python基础必备之语法结构详解

    Python基础必备之语法结构详解 1. Python的基本语法结构 Python是一种解释型语言,代码的执行不需要进行编译,只需要在Python解释器中进行解释。Python的基本语法结构包括以下几部分: 1.1 注释 注释用于说明代码的作用和思路,提高代码的可读性和可维护性。Python中的注释以#开头,单行注释和多行注释都可以使用。 示例1:单行注释 …

    python 2023年5月30日
    00
  • Python中的random函数实例详解

    Python中的random函数实例详解 本文将详细讲解Python中random模块中的一些常见函数,包括random()函数、randint(a, b)函数、choice(seq)函数、shuffle(seq)函数以及sample(population, k)函数。下文将会简单解释各个函数的用途以及使用方法,并给出一些示例。 random()函数 ran…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部