February 26, 2024

Python魔术方法

基本魔术方法

  1. **__init__**:对象初始化方法,在创建对象时调用。通常用来初始化对象的属性。

    1
    2
    3
    class Example:
    def __init__(self, value):
    self.value = value
  2. **__repr__**:返回对象的“官方”字符串表示形式。通常可以通过调用 repr(object) 来查看。

    1
    2
    3
    class Example:
    def __repr__(self):
    return f"Example(value={self.value})"
  3. **__str__**:返回对象的“非正式”或友好字符串表示形式。通常可以通过调用 str(object)print(object) 来查看。

    1
    2
    3
    class Example:
    def __str__(self):
    return f"Example with value {self.value}"
  4. **__len__**:返回对象的长度。常用于实现自定义容器类。

    1
    2
    3
    class Container:
    def __len__(self):
    return len(self.items)
  5. **__getitem__**:获取对象中指定键的值。通常用于实现自定义的索引操作。

    1
    2
    3
    class Container:
    def __getitem__(self, key):
    return self.items[key]
  6. **__setitem__**:设置对象中指定键的值。常用于实现可变容器。

    1
    2
    3
    class Container:
    def __setitem__(self, key, value):
    self.items[key] = value
  7. **__delitem__**:删除对象中指定键的值。

    1
    2
    3
    class Container:
    def __delitem__(self, key):
    del self.items[key]
  8. **__iter__**:返回一个迭代器对象。通常用于实现可迭代对象。

    1
    2
    3
    class Container:
    def __iter__(self):
    return iter(self.items)
  9. **__contains__**:检查对象是否包含指定的元素。通常用于 in 操作符。

    1
    2
    3
    class Container:
    def __contains__(self, item):
    return item in self.items
  10. **__call__**:使实例对象可以像函数一样被调用。

    1
    2
    3
    class Example:
    def __call__(self, value):
    self.value = value
  11. **__base__**:返回当前类的基类。如 SomeClass.__base__ 会返回 <class 'object'>

  12. **__subclasses__()**:查看当前类的子类组成的列表。

    1
    Example.__subclasses__()
  13. **__builtins__**:以一个集合的形式查看其引用。

    1
    2
    import builtins
    dir(builtins)
  14. **__getattr____setattr____delattr__**:处理对象属性的获取、设置和删除。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Example:
    def __getattr__(self, name):
    return f"{name} not found"

    def __setattr__(self, name, value):
    self.__dict__[name] = value

    def __delattr__(self, name):
    del self.__dict__[name]
  15. **__enter____exit__**:定义在使用 with 语句时对象的上下文管理行为。

    1
    2
    3
    4
    5
    6
    7
    8
    class Example:
    def __enter__(self):
    # Setup code
    return self

    def __exit__(self, exc_type, exc_val, exc_tb):
    # Teardown code
    pass
  16. **__class__**:指向对象的类。可以用来获取对象的类信息。

    1
    2
    obj = Example()
    print(obj.__class__) # <class '__main__.Example'>
  17. **__delattr__**:当试图删除对象的属性时调用。

    1
    2
    3
    4
    class Example:
    def __delattr__(self, name):
    print(f"Deleting attribute {name}")
    super().__delattr__(name)
  18. **__dict__**:包含对象(但不包括从类继承的属性)的属性字典。

    1
    2
    obj = Example()
    print(obj.__dict__) # {'attribute': value}
  19. **__dir__**:由 dir() 函数调用,用于列出对象的属性和方法。

    1
    2
    3
    class Example:
    def __dir__(self):
    return ['custom_attribute', 'another_attribute']
  20. **__doc__**:类或方法的文档字符串。

    1
    2
    3
    class Example:
    """This is a docstring."""
    print(Example.__doc__) # "This is a docstring."
  21. **__eq__**:实现对象的相等性比较,通常由 == 操作符调用。

    1
    2
    3
    class Example:
    def __eq__(self, other):
    return self.value == other.value
  22. **__format__**:用于实现自定义的字符串格式化。

    1
    2
    3
    class Example:
    def __format__(self, format_spec):
    return f"Formatted value: {self.value:{format_spec}}"
  23. **__ge__**:实现对象的“大于等于”比较,通常由 >= 操作符调用。

    1
    2
    3
    class Example:
    def __ge__(self, other):
    return self.value >= other.value
  24. **__getattribute__**:在访问对象属性时调用,优先于 __getattr__

    1
    2
    3
    4
    class Example:
    def __getattribute__(self, name):
    print(f"Accessing attribute {name}")
    return super().__getattribute__(name)
  25. **__getstate__**:用于对象序列化时返回要保存的状态。

    1
    2
    3
    4
    class Example:
    def __getstate__(self):
    state = self.__dict__.copy()
    return state
  26. **__gt__**:实现对象的“大于”比较,通常由 > 操作符调用。

    1
    2
    3
    class Example:
    def __gt__(self, other):
    return self.value > other.value
  27. **__hash__**:实现对象的哈希值计算,通常由 hash() 函数调用。对象的哈希值应保持不变。

    1
    2
    3
    class Example:
    def __hash__(self):
    return hash(self.value)
  28. **__init_subclass__**:在子类化时调用,可以用来自定义子类的行为。

    1
    2
    3
    4
    class Base:
    def __init_subclass__(cls, **kwargs):
    super().__init_subclass__(**kwargs)
    cls.custom_attribute = True
  29. **__le__**:实现对象的“小于等于”比较,通常由 <= 操作符调用。

    1
    2
    3
    class Example:
    def __le__(self, other):
    return self.value <= other.value
  30. **__lt__**:实现对象的“小于”比较,通常由 < 操作符调用。

    1
    2
    3
    class Example:
    def __lt__(self, other):
    return self.value < other.value
  31. **__module__**:指向定义类的模块名称。

    1
    2
    3
    class Example:
    pass
    print(Example.__module__) # __main__
  32. **__ne__**:实现对象的不等性比较,通常由 != 操作符调用。

    1
    2
    3
    class Example:
    def __ne__(self, other):
    return self.value != other.value
  33. **__new__**:创建并返回一个新对象实例,通常在对象实例化时调用,优先于 __init__

    1
    2
    3
    4
    class Example:
    def __new__(cls, *args, **kwargs):
    instance = super().__new__(cls)
    return instance
  34. **__reduce__**:用于定义对象序列化的行为,返回一个元组来帮助对象序列化。

    1
    2
    3
    class Example:
    def __reduce__(self):
    return (self.__class__, (self.value,))
  35. **__reduce_ex__**:与 __reduce__ 类似,但可以支持更多的协议版本。

    1
    2
    3
    class Example:
    def __reduce_ex__(self, protocol):
    return (self.__class__, (self.value,))
  36. **__repr__**:返回对象的“官方”字符串表示形式。通常可以通过调用 repr(object) 来查看。

    1
    2
    3
    class Example:
    def __repr__(self):
    return f"Example(value={self.value})"
  37. **__setattr__**:当试图设置对象的属性时调用。

    1
    2
    3
    4
    class Example:
    def __setattr__(self, name, value):
    print(f"Setting attribute {name} to {value}")
    super().__setattr__(name, value)
  38. **__sizeof__**:返回对象占用的内存大小,通常由 sys.getsizeof() 调用。

    1
    2
    3
    class Example:
    def __sizeof__(self):
    return object.__sizeof__(self) + sum(sys.getsizeof(v) for v in self.__dict__.values
  39. **__subclasshook__**:自定义类的子类检测逻辑。通常由 issubclass() 调用。

    1
    2
    3
    4
    class Base:
    @classmethod
    def __subclasshook__(cls, subclass):
    return hasattr(subclass, 'custom_method')
  40. **__weakref__**:用于支持弱引用,如果类中没有 __slots__ 属性,则对象的弱引用字典会自动包含此属性。

    1
    2
    3
    4
    5
    6
    7
    8
    import weakref

    class Example:
    pass

    obj = Example()
    r = weakref.ref(obj)
    print(r) # <weakref at 0x...; to 'Example' at 0x...>

常用

__doc__:查看默认类的帮助

dir()查看类的所有属性方法

chr,ordASCII码和字符的转换。

globals:返回全局变量的函数

locals:返回所有局部变量

__import__:import os 等价于 os = __import__(‘os’)

__file__:当前运行代码所在路径

_:该变量返回上一次运行的python语句结果,但仅仅会在运行交互式终端时产生,运行代码文件是不会有此变量。

About this Post

This post is written by void2eye, licensed under CC BY-NC 4.0.

#Web