探索Python中双下划线的特殊方法属性魔法世界

 更新时间:2023年11月12日 10:35:21   作者:涛哥聊Python  
这篇文章主要为大家介绍了Python中双下划线的特殊方法属性魔法世界探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

特殊方法(Magic Methods)

Python中的特殊方法和属性,我们可以了解到这些功能是如何为自定义类和对象提供强大的控制和自定义选项的。

这些特殊方法和属性具有特定的名称和用途,以双下划线__开头和结尾。它们允许覆盖默认行为,从而实现更灵活的对象交互和自定义类的行为。

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

__init__是在创建新对象时首先调用的方法。用于初始化对象的属性和执行任何必要的设置。通常会在自定义类中定义的第一个方法。

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

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

__str__方法定义了对象的字符串表示。使用str(obj)或print(obj)时,将调用此方法。

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

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

__repr__方法返回对象的"官方"字符串表示,通常是一个可以用来重新创建该对象的表达式。它对于调试和开发非常有用。

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

4. __len__(self): 长度

__len__方法定义了对象的长度,可以通过len(obj)来调用。

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

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

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

__getitem__方法用于通过键或索引访问对象的元素,可通过obj[key]来调用。

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

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

__setitem__方法允许您通过键或索引设置对象的元素,可通过obj[key] = value来调用。

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

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

__delitem__方法定义了删除对象元素的操作,可通过del obj[key]来调用。

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

8. __iter__(self): 迭代器

__iter__方法返回一个可迭代对象,通常与__next__方法一起使用,实现对象的迭代。

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__方法一起使用,可在循环中调用。

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

__contains__方法用于判断对象是否包含某个元素,可通过item in obj来调用。

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

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

__eq__方法定义了对象的相等性比较,可通过obj == other来调用。

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

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

__ne__方法定义了对象的不相等性比较,可通过obj != other来调用。

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

__lt__方法定义了对象的小于比较,可通过obj < other来调用。

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

__le__方法定义了对象的小于等于比较,可通过obj <= other来调用。

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

__gt__方法定义了对象的大于比较,可通过obj > other来调用。

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

__ge__方法定义了对象的大于等于比较,可通过obj >= other来调用。

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

特殊属性(Magic Attributes)

1. __doc__: 文档字符串

__doc__属性包含类或函数的文档字符串,可以通过obj.__doc__来访问。这对于文档和注释非常有用。

class MyClass:
    """这是我的类的文档字符串。"""

print(MyClass.__doc__)

2. __class__: 类

__class__属性包含对象所属的类,可以通过obj.__class__来访问。

class MyClass:
    pass

obj = MyClass()
print(obj.__class__)

3. __name__: 模块

名称

__name__属性包含模块的名称,对于模块级别的代码有用。

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

4. __file__: 模块文件路径

__file__属性包含模块的文件路径,对于模块级别的代码有用。

print(__file__)

5. __dict__: 属性字典

__dict__属性包含对象的属性和方法的字典。可以动态地添加、修改或删除对象的属性。

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

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

__dir__()方法返回对象的属性和方法的列表,可以通过dir(obj)来调用。这对于查看对象的可用成员非常有用。

class MyClass:
    def my_method(self):
        pass
print(dir(MyClass()))

7. __slots__: 属性限制

__slots__属性允许限制类的属性,使其只能包含指定的属性,从而节省内存。这在需要创建大量对象时很有用。

class MyObject:
    __slots__ = ('name', 'age')

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

8. __bases__: 直接父类元组

__bases__属性包含类的直接父类的元组,通常在类继承和多重继承时使用。

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

9. __subclasses__(): 子类列表

__subclasses__()方法返回类的所有直接子类,通常与issubclass()函数一起使用。

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

10. __mro__: 方法解析顺序

__mro__属性包含类的方法解析顺序元组(Method Resolution Order),通常在多重继承中查找方法时使用。

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

总结

特殊方法和属性是Python中强大而灵活的工具,用于自定义类和对象的行为。

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

理解并灵活运用这些特殊方法和属性能够更好地定制和控制Python代码,使其适应各种需求和场景。

以上就是探索Python中双下划线的特殊方法属性魔法世界的详细内容,更多关于Python双下划线方法属性的资料请关注脚本之家其它相关文章!

相关文章

  • python中np.random.permutation函数实例详解

    python中np.random.permutation函数实例详解

    np.random.permutation是numpy中的一个函数,它可以将一个数组中的元素随机打乱,返回一个打乱后的新数组,下面这篇文章主要给大家介绍了关于python中np.random.permutation函数的相关资料,需要的朋友可以参考下
    2023-04-04
  • python字符串格式化方式解析

    python字符串格式化方式解析

    这篇文章主要介绍了python字符串格式化方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • python数据写入列表并导出折线图

    python数据写入列表并导出折线图

    这篇文章主要介绍了python数据写入列表并导出折线图,文章以举例展开对文章主题的介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-01-01
  • Django使用celery异步发送短信验证码代码示例

    Django使用celery异步发送短信验证码代码示例

    这篇文章主要介绍了Django中如何使用celery异步发送短信验证码的代码示例,有需要的朋友可以借鉴参考下,希望可以对大家有所帮助
    2021-09-09
  • pycharm全局搜索的具体步骤

    pycharm全局搜索的具体步骤

    在本篇文章里小编给大家整理的是一篇关于pycharm全局搜索的具体步骤,有需要的朋友们可以参考下。
    2020-07-07
  • 在Python中封装GObject模块进行图形化程序编程的教程

    在Python中封装GObject模块进行图形化程序编程的教程

    这篇文章主要介绍了在Python中封装GObject模块进行图形化程序编程的教程,本文来自于IBM官方网站技术文档,需要的朋友可以参考下
    2015-04-04
  • 详解查看Python解释器路径的两种方式

    详解查看Python解释器路径的两种方式

    这篇文章主要介绍了详解查看Python解释器路径的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Python入门篇之对象类型

    Python入门篇之对象类型

    本章中我们将讲述Python的对象类型,包括数字、整型、布尔型、长整形、浮点型、复数型、字符串、列表、元组、字典等。
    2014-10-10
  • 如何利用Python保留指定位数的小数

    如何利用Python保留指定位数的小数

    这篇文章主要给大家介绍了关于如何利用Python保留指定位数的小数,,代码简单易懂,非常不错,对大家学习或者使用Python具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • 理解Python垃圾回收机制

    理解Python垃圾回收机制

    这篇文章主要为大家详细介绍了Python垃圾回收机制,Python中的垃圾回收以引用计数为主,分代收集为辅,想要深入理解Python垃圾回收机制,请阅读下文
    2016-02-02

最新评论