欢迎来到我的个人博客,有Python技术,自媒体,创业,APP开发问题随时讨论交流

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

Python sitin 8个月前 (10-08) 179次浏览 已收录 0个评论
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代码,使其适应各种需求和场景。

喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址