首页 > 编程语言 >python类中 __开头的函数【魔法方法】

python类中 __开头的函数【魔法方法】

时间:2024-12-20 14:42:21浏览次数:4  
标签:__ python self value other def MyClass 类中

在Python中,魔法方法(Magic Methods)或双下划线方法(Dunder Methods)是一类特殊的方法,它们以双下划线(__)开头和结尾。这些方法为对象提供了丰富的功能,允许你定义对象的内置操作行为,如初始化、比较、表示、数学运算等。

以下是一些常见的魔法方法及其用途,并附有相应的示例代码。

1. 初始化与销毁

__init__(self, ...)

用于对象的初始化

class MyClass:
    def __init__(self, value):
        self.value = value
 
obj = MyClass(10)
print(obj.value)  # 输出: 10

__del__(self)

用于对象的销毁,当对象不再被使用时调用(但不一定立即调用)。

class MyClass:
    def __init__(self, value):
        self.value = value
        print(f"Object created with value: {value}")

    def __del__(self):
        print("Object destroyed")

obj = MyClass(10)
# 当obj超出作用域时,__del__方法会被调用(在某些情况下,如循环引用,可能不会立即调用)

2. 表示

__str__(self)

定义对象的字符串表示。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return f"MyClass with value: {self.value}"

obj = MyClass(10)
print(obj)  # 输出: MyClass with value: 10

__repr__(self)

定义对象的官方字符串表示,通常用于调试。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __repr__(self):
        return f"MyClass({self.value})"

obj = MyClass(10)
print(obj)  # 输出: MyClass(10)

3. 比较

__eq__(self, other)

定义对象的相等性比较。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        if isinstance(other, MyClass):
            return self.value == other.value
        return False

obj1 = MyClass(10)
obj2 = MyClass(10)
print(obj1 == obj2)  # 输出: True

__lt__(self, other)

定义对象的小于比较。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __lt__(self, other):
        if isinstance(other, MyClass):
            return self.value < other.value
        return NotImplemented

obj1 = MyClass(5)
obj2 = MyClass(10)
print(obj1 < obj2)  # 输出: True

__le__(self, other)

用于定义对象的小于等于(<=)比较行为。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __le__(self, other):
        return self.value <= other.value

obj1 = MyClass(10)
obj2 = MyClass(10)
print(obj1 <= obj2)  # 输出: True

__ne__(self, other)

用于定义对象的不等于(!=)比较行为。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __ne__(self, other):
        return self.value != other.value

obj1 = MyClass(10)
obj2 = MyClass(20)
print(obj1 != obj2)  # 输出: True

__gt__(self, other)

用于定义对象的大于(>)比较行为。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __gt__(self, other):
        return self.value > other.value

obj1 = MyClass(20)
obj2 = MyClass(10)
print(obj1 > obj2)  # 输出: True

__ge__(self, other)

用于定义对象的大于等于(>=)比较行为。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __ge__(self, other):
        return self.value >= other.value

obj1 = MyClass(20)
obj2 = MyClass(10)
print(obj1 >= obj2)  # 输出: True

4. 数学运算

__add__(self, other)

定义对象的加法运算。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        if isinstance(other, MyClass):
            return MyClass(self.value + other.value)
        return NotImplemented

obj1 = MyClass(5)
obj2 = MyClass(10)
obj3 = obj1 + obj2
print(obj3.value)  # 输出: 15

__mul__(self, other)

定义对象的乘法运算。

class MyClass:
    def __init__(self, value):
        self.value = value

    def __mul__(self, other):
        if isinstance(other, (int, float)):
            return MyClass(self.value * other)
        return NotImplemented

obj = MyClass(5)
obj2 = obj * 2
print(obj2.value)  # 输出: 10

5. 容器类型

__len__(self)

定义对象的长度。

class MyClass:
    def __init__(self, *values):
        self.values = values

    def __len__(self):
        return len(self.values)

obj = MyClass(1, 2, 3, 4)
print(len(obj))  # 输出: 4

__getitem__(self, key)

定义对象的索引操作。

class MyClass:
    def __init__(self, *values):
        self.values = list(values)

    def __getitem__(self, key):
        return self.values[key]

obj = MyClass(1, 2, 3, 4)
print(obj[1])  # 输出: 2

__setitem__(self, key, value)

定义对象的索引赋值操作。

class MyClass:
    def __init__(self, *values):
        self.values = list(values)

    def __setitem__(self, key, value):
        self.values[key] = value

obj = MyClass(1, 2, 3, 4)
obj[1] = 20
print(obj.values)  # 输出: [1, 20, 3, 4]

6. 可迭代与迭代器

__iter__(self)

定义对象的迭代器。

class MyClass:
    def __init__(self, *values):
        self.values = values

    def __iter__(self):
        self.index = 0
        return self

    def __next__(self):
        if self.index < len(self.values):
            result = self.values[self.index]
            self.index += 1
            return result
        else:
            raise StopIteration

obj = MyClass(1, 2, 3, 4)
for item in obj:
    print(item)  # 输出: 1, 2, 3, 4

7. 上下文管理

__enter__(self)

定义进入上下文管理器的行为。

__exit__(self, exc_type, exc_val, exc_tb)

定义退出上下文管理器的行为。

class MyClass:
    def __enter__(self):
        print("Entering the context")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Exiting the context")
        return False  # 如果返回True,则异常会被忽略

with MyClass():
    print("Inside the context")
# 输出:
# Entering the context
# Inside the context
# Exiting the context

8. 返回值dict

__dict__

__dict__ 是一个字典属性,它包含了对象及其类的所有属性和它们的值。这个属性对于动态地查看和修改对象的属性非常有用。

class MyClass:
    def __init__(self, a, b):
        self.a = a
        self.b = b

obj = MyClass(1, 2)
print(obj.__dict__)  # 输出: {'a': 1, 'b': 2}

 

标签:__,python,self,value,other,def,MyClass,类中
From: https://www.cnblogs.com/wyj497022944/p/18619259

相关文章

  • 国标GB28181软件LiteGBS设备接入指南:摄像头怎么通过GB28181协议对接到监控平台中?
    在现代安防监控系统中,国标GB28181协议扮演着至关重要的角色,它为视频监控设备与监控平台之间的互联互通提供了标准化的解决方案。LiteGBS国标GB28181设备管理软件作为符合国标GB28181的视频平台,通过该协议能够实现对摄像头的高效管理和控制。在实际应用中,如果想要通过GB28181协议......
  • Slort pg walkthrough Intermediate window
    nmap┌──(root㉿kali)-[~]└─#nmap-p--A-sS192.168.226.53StartingNmap7.94SVN(https://nmap.org)at2024-12-2004:30UTCStats:0:01:10elapsed;0hostscompleted(1up),1undergoingServiceScanServicescanTiming:About40.00%done;ETC:04:32......
  • 国云官网焕新升级,共创数智未来!
    近日,天翼云官网正式升级焕新,通过全新改版和功能优化,为用户打造更加高效的服务体验,助力企业数字化转型升级提速!作为云服务国家队,天翼云历经十几年发展,走出了一条以科技创新驱动高质量发展之路。如今,天翼云已经全面迈向智能云发展的新阶段。天翼云官网与时俱进,围绕天翼云红云的......
  • 渗透测试0day漏洞库-威胁情报库-每日更新1day 0day漏洞通知
       渗透测试0day漏洞库-威胁情报库-每日更新1day0day漏洞通知0x01简介         星球拥有1day/0day漏洞文库(每周一至周五更新1day/0day漏洞),2024漏洞文库已更新POC3500+(累计收集12w+的POC),如果你想学习更多渗透挖洞技术/技巧欢迎加入我们内部星球可获得内部工具字......
  • linux操作系统centos7新增硬盘进行在线扩容
    扩容前查看系统lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTsda8:00300G0disk├─sda18:101G0part/boot└─sda28:20299G0part├─centos-root253:00285.1G0lvm/......
  • Web APIs - 第6章笔记
    正则表达式什么是正则表达式?正则表达式(RegularExpression)是一种字符串匹配的模式(规则)使用场景:例如验证表单:手机号表单要求用户只能输入11位的数字(匹配)过滤掉页面内容中的一些敏感词和高亮搜索关键字(替换)从字符串中获取我们想要的特定部分(提取)正则基本......
  • Fiddler手机抓包设置步骤
    一、使用场景1、模拟弱网环境,进行弱网测试;2、抓取手机端应用程序的信息。二、具体设置1、Fiddler端设置a、在Tools菜单中选择Options...  b、在Options中选择Connections,将端口设置8888,勾选Allowremotecomputerstoconnect等。如下图: c、查看自己的IP地址,确保PC端......
  • K - means 聚类算法
    一、引言在数据挖掘和机器学习领域,聚类算法是一种重要的无监督学习方法,用于将数据集中的数据点划分为不同的组或簇。K-means聚类算法是其中最为经典和广泛应用的算法之一,它简单且高效,能够快速地对大规模数据集进行处理。本文将详细介绍K-means聚类算法的原理、应用场景......
  • 爬虫关于编解码
    1.现象如下:Traceback(mostrecentcalllast):File"E:\spiders\caipiao.py",line37,in<module>print(response.content.decode('gbk',errors='strict'))UnicodeDecodeError:'gbk'codeccan'tdecodeb......
  • python学习——与时间日期相关的方法
    文章目录类方法例子不用考虑闰年了!Python中处理日期和时间的功能主要依赖于datetime模块。类datetime.date:表示日期(年、月、日)的类。datetime.time:表示时间(小时、分钟、秒、微秒)的类。datetime.datetime:表示日期和时间的组合。datetime.timedelta:表......