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

发表于:2023-11-10 09:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:涛哥聊Python    来源:今日头条

  Python中的特殊方法和属性,我们可以了解到这些功能是如何为自定义类和对象提供强大的控制和自定义选项的。
  这些特殊方法和属性具有特定的名称和用途,以双下划线__开头和结尾。它们允许覆盖默认行为,从而实现更灵活的对象交互和自定义类的行为。
  特殊方法(Magic Methods)
  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代码,使其适应各种需求和场景。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号