当前位置:首页 > 科技  > 软件

Python中的双下划线:特殊方法和属性的魔法世界!

来源: 责编: 时间:2023-11-09 09:14:34 402观看
导读Python中的特殊方法和属性,我们可以了解到这些功能是如何为自定义类和对象提供强大的控制和自定义选项的。这些特殊方法和属性具有特定的名称和用途,以双下划线__开头和结尾。它们允许覆盖默认行为,从而实现更灵活的对象

67K28资讯网——每日最新资讯28at.com

Python中的特殊方法和属性,我们可以了解到这些功能是如何为自定义类和对象提供强大的控制和自定义选项的。67K28资讯网——每日最新资讯28at.com

这些特殊方法和属性具有特定的名称和用途,以双下划线__开头和结尾。它们允许覆盖默认行为,从而实现更灵活的对象交互和自定义类的行为。67K28资讯网——每日最新资讯28at.com

特殊方法(Magic Methods)

1、 __init__(self, ...): 构造方法

__init__是在创建新对象时首先调用的方法。用于初始化对象的属性和执行任何必要的设置。通常会在自定义类中定义的第一个方法。67K28资讯网——每日最新资讯28at.com

class Person:    def __init__(self, name, age):        self.name = name        self.age = age

2、 __str__(self): 字符串表示

__str__方法定义了对象的字符串表示。使用str(obj)print(obj)时,将调用此方法。67K28资讯网——每日最新资讯28at.com

class Person:    def __str__(self):        return f"{self.name}, {self.age} years old"

3、 __repr__(self): 官方字符串表示

__repr__方法返回对象的"官方"字符串表示,通常是一个可以用来重新创建该对象的表达式。它对于调试和开发非常有用。67K28资讯网——每日最新资讯28at.com

class Person:    def __repr__(self):        return f"Person('{self.name}', {self.age})"

4、__len__(self): 长度

__len__方法定义了对象的长度,可以通过len(obj)来调用。67K28资讯网——每日最新资讯28at.com

class MyList:    def __init__(self, items):        self.items = items    def __len__(self):        return len(self.items)

5、__getitem__(self, key): 获取元素

__getitem__方法用于通过键或索引访问对象的元素,可通过obj[key]来调用。67K28资讯网——每日最新资讯28at.com

class MyList:    def __getitem__(self, index):        return self.items[index]

6、__setitem__(self, key, value): 设置元素

__setitem__方法允许您通过键或索引设置对象的元素,可通过obj[key] = value来调用。67K28资讯网——每日最新资讯28at.com

class MyList:    def __setitem__(self, index, value):        self.items[index] = value

7、__delitem__(self, key): 删除元素

__delitem__方法定义了删除对象元素的操作,可通过del obj[key]来调用。67K28资讯网——每日最新资讯28at.com

class MyList:    def __delitem__(self, index):        del self.items[index]

8、__iter__(self): 迭代器

__iter__方法返回一个可迭代对象,通常与__next__方法一起使用,实现对象的迭代。67K28资讯网——每日最新资讯28at.com

class MyList:    def __iter__(self):        self.index = 0        return self    def __next__(self):        if self.index < len(self.items):            result = self.items[self.index]            self.index += 1            return result        else:            raise StopIteration

9、__next__(self): 下一个迭代值

__next__方法用于返回迭代器的下一个值,通常与__iter__方法一起使用,可在循环中调用。67K28资讯网——每日最新资讯28at.com

10、__contains__(self, item): 包含性检查

__contains__方法用于判断对象是否包含某个元素,可通过item in obj来调用。67K28资讯网——每日最新资讯28at.com

class MyList:    def __contains__(self, item):        return item in self.items

11、__eq__(self, other): 相等性比较

__eq__方法定义了对象的相等性比较,可通过obj == other来调用。67K28资讯网——每日最新资讯28at.com

class Point:    def __eq__(self, other):        return self.x == other.x and self.y == other.y

12、__ne__(self, other): 不相等性比较

__ne__方法定义了对象的不相等性比较,可通过obj != other来调用。67K28资讯网——每日最新资讯28at.com

13、__lt__(self, other): 小于比较

__lt__方法定义了对象的小于比较,可通过obj < other来调用。67K28资讯网——每日最新资讯28at.com

14、__le__(self, other): 小于等于比较

__le__方法定义了对象的小于等于比较,可通过obj <= other来调用。67K28资讯网——每日最新资讯28at.com

15、__gt__(self, other): 大于比较

__gt__方法定义了对象的大于比较,可通过obj > other来调用。67K28资讯网——每日最新资讯28at.com

16、__ge__(self, other): 大于等于比较

__ge__方法定义了对象的大于等于比较,可通过obj >= other来调用。67K28资讯网——每日最新资讯28at.com

这些特殊方法允许自定义类的行为,使其能够按照需求进行构建和交互。通过覆盖这些方法,可以实现更高级的功能,例如自定义容器类、实现迭代器、支持比较操作等。67K28资讯网——每日最新资讯28at.com

特殊属性(Magic Attributes)

1、__doc__: 文档字符串

__doc__属性包含类或函数的文档字符串,可以通过obj.__doc__来访问。这对于文档和注释非常有用。67K28资讯网——每日最新资讯28at.com

class MyClass:    """这是我的类的文档字符串。"""print(MyClass.__doc__)

2、__class__: 类

__class__属性包含对象所属的类,可以通过obj.__class__来访问。67K28资讯网——每日最新资讯28at.com

class MyClass:    passobj = MyClass()print(obj.__class__)

3、__name__: 模块

名称:67K28资讯网——每日最新资讯28at.com

__name__属性包含模块的名称,对于模块级别的代码有用。67K28资讯网——每日最新资讯28at.com

if __name__ == "__main__":    print("This code is executed only when the script is run directly.")

4、__file__: 模块文件路径

__file__属性包含模块的文件路径,对于模块级别的代码有用。67K28资讯网——每日最新资讯28at.com

print(__file__)

5、__dict__: 属性字典

__dict__属性包含对象的属性和方法的字典。可以动态地添加、修改或删除对象的属性。67K28资讯网——每日最新资讯28at.com

class Person:    passperson = Person()person.name = "Alice"person.age = 30print(person.__dict__)

6、__dir__(): 属性和方法列表

__dir__()方法返回对象的属性和方法的列表,可以通过dir(obj)来调用。这对于查看对象的可用成员非常有用。67K28资讯网——每日最新资讯28at.com

class MyClass:    def my_method(self):        passprint(dir(MyClass()))

7、__slots__: 属性限制

__slots__属性允许限制类的属性,使其只能包含指定的属性,从而节省内存。这在需要创建大量对象时很有用。67K28资讯网——每日最新资讯28at.com

class MyObject:    __slots__ = ('name', 'age')obj = MyObject()obj.name = "Alice"obj.age = 30obj.address = "123 Main St."  # 会引发异常,因为'address'不在__slots__中

8、__bases__: 直接父类元组

__bases__属性包含类的直接父类的元组,通常在类继承和多重继承时使用。67K28资讯网——每日最新资讯28at.com

class Parent1:    passclass Parent2:    passclass Child(Parent1, Parent2):    passprint(Child.__bases__)  # 输出 (<class '__main__.Parent1'>, <class '__main__.Parent2'>)

9、__subclasses__(): 子类列表

__subclasses__()方法返回类的所有直接子类,通常与issubclass()函数一起使用。67K28资讯网——每日最新资讯28at.com

class Parent:    passclass Child1(Parent):    passclass Child2(Parent):    passprint(Parent.__subclasses__())  # 输出 [<class '__main__.Child1'>, <class '__main__.Child2'>]

10、__mro__: 方法解析顺序

__mro__属性包含类的方法解析顺序元组(Method Resolution Order),通常在多重继承中查找方法时使用。67K28资讯网——每日最新资讯28at.com

class A:    def foo(self):        passclass B(A):    def foo(self):        passclass C(A):    def foo(self):        passclass D(B, C):    passprint(D.__mro__)  # 输出 (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

总结

特殊方法和属性是Python中强大而灵活的工具,用于自定义类和对象的行为。67K28资讯网——每日最新资讯28at.com

通过使用这些特殊方法和属性,可以实现自定义的构造函数、字符串表示、比较操作、迭代器等功能。特殊属性则能够访问与类和模块相关的元数据信息。67K28资讯网——每日最新资讯28at.com

理解并灵活运用这些特殊方法和属性能够更好地定制和控制Python代码,使其适应各种需求和场景。67K28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17891-0.htmlPython中的双下划线:特殊方法和属性的魔法世界!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: As Const:一个被低估的 TypeScript 特性

下一篇: Springboot内置的工具类之ObjectUtils

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 疑似小米14外观设计图曝光:后置相机模组变化不大

    下半年的大幕已经开启,而谁将成为下半年手机圈的主角就成为了大家关注的焦点,其中被传有望拿下新一代骁龙8 Gen3旗舰芯片的小米14系列更是备受大家瞩
  • 三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    7月29日消息,三星率先发力可折叠手机市场,在全球市场已经取得了非常亮眼的成绩,接下来会进一步巩固和扩大这一优势。三星在推出Galaxy Z Flip5和Galax
Top