zoukankan      html  css  js  c++  java
  • 如何使用特殊方法

    特殊方法的存在是为了被 Python 解释器调用的,你自己 并不需要调用它们。也就是说没有 my_object.__len__() 这种写法, 而应该使用 len(my_object)。在执行 len(my_object) 的时候,如果 my_object 是一个自定义类的对象,那么 Python 会自己去调用其中由 你实现的 __len__ 方法。

    然而如果是 Python 内置的类型,比如列表(list)、字符串(str)、 字节序列(bytearray)等,那么 CPython 会抄个近路,__len__ 实际 上会直接返回 PyVarObject 里的 ob_size 属性。PyVarObject 是表示 内存中长度可变的内置对象的 C 语言结构体。直接读取这个值比调用一 个方法要快很多。

    很多时候,特殊方法的调用是隐式的,比如 for i in x: 这个语句, 背后其实用的是 iter(x),而这个函数的背后则是 x.__iter__() 方 法。当然前提是这个方法在 x 中被实现了。

    通常你的代码无需直接使用特殊方法。除非有大量的元编程存在,直接 调用特殊方法的频率应该远远低于你去实现它们的次数。唯一的例外可 能是 __init__ 方法,你的代码里可能经常会用到它,目的是在你自己 的子类的 __init__ 方法中调用超类的构造器。

    通过内置的函数(例如 len、iter、str,等等)来使用特殊方法是最 好的选择。这些内置函数不仅会调用特殊方法,通常还提供额外的好 处,而且对于内置的类来说,它们的速度更快。

    不要自己想当然地随意添加特殊方法,比如 __foo__ 之类的,因为虽 然现在这个名字没有被 Python 内部使用,以后就不一定了。

  • 相关阅读:
    LeetCode 88. Merge Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 581. Shortest Unsorted Continuous Subarray
    LeetCode 20. Valid Parentheses
    LeetCode 53. Maximum Subarray
    LeetCode 461. Hamming Distance
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 976. Largest Perimeter Triangle
    LeetCode 1295. Find Numbers with Even Number of Digits
    如何自学并且系统学习计算机网络?(知乎问答)
  • 原文地址:https://www.cnblogs.com/lshedward/p/10117031.html
Copyright © 2011-2022 走看看