python 查漏补缺:一

一: python 下划线_ __ __xx__

  1. _单下划线开头:弱”内部使用”标识,表property如:from M import *,将不导入所有以下划线开头的对象,包括包、模块、成员
  2. 单下划线结尾_:只是为了避免与python关键字的命名冲突
  3. __双下划线开头:模块内的成员,表示私有成员,外部无法直接调用,同时可以避免你的方法被重载,举例:
   class A(object):
    def __method(self):
        print "I'm a method in A"
    
    def method(self):
        return self.__method()
    class B(A):
    def __method(self):
        print "I'm a method in B"
    
    def method(self):
        return self.__method()
        # return self._A__method()
        
        
    $python 1.py
    out:  I'm a method in B
    #out : I'm a method in A
    #如果想要输出 `I'm a method in B`,需要明确指出`_A__method()`
  1. __双下划线开头双下划线结尾__:指那些包含在用户无法控制的命名空间中的“魔术”对象或属性,如类成员的__name____doc____init__、__import__、__file__、等。推荐永远不要将这样的命名方式应用于自己的变量或函数。这些方法也是不可调用的,这是python calls的方法。可以重写这些方法。special-method-names documentation

二:Python3.x和Python2.x的区别

  1. 博客园
  2. 程序师

三:时间复杂度

  1. 判断一个元素是否在一组元素中存在(if ** in l:),使用list(type(l) is list)的算法复杂度是O(n),而使用set(type(l) is set)的算法复杂度是O(1)
  2. Python官方Wiki有一份专门数据结构操作的时间复杂度文档
  3. list.sort()内部采用的算法是timsort,时间复杂度:平均:O(n log n),复杂度比较Wiki Timsort, Timsort source code source code text

四:单例模式

  1. 继承类: base class Singleton class 需要重载__new__(),__new__()返回一个instance ,new class override Singleton class
  2. 装饰器( 需要用到类装饰器,非函数装饰器,自动调用构造函数): decorate class (Singleton is defined 函数,使用装饰器时用class name 做参数)
  3. metaclass:__metaclass__ (Singleton 可调用,重载__call__)

五:staticmethod, classmethod

  class Kls(object):
    def __init__(self, data):
        self.data = data

    def printd(self):              #printd 只能被实例调用
        print(self.data)

    @staticmethod                 #可以被类Kls之内调用
    def smethod(*arg):
        print('Static:', arg)

    @classmethod
    def cmethod(*arg): #可以被类Kls直接调用,或者被*args调用,airgs实际上指的就是类Kls
        print('Class:', arg)
  1. 区别:;类内一般定义一个函数,需要被实例引用,函数参数有self,self即是指的实例。但是:
    • staticmethod and classmethod 可以被自身类name (Kls)直接引用,可以通过类名Kls调用方法或者类内属性等
    • staticmethod 参数不需要实例化的self,代表自身类的cls等;classmethod不需要self,但是需要cls(名字可以换), 表示的是类的别名( 即cls = Kls),可以通过类名Kls或者cls直接调用函数或者类内属性
  2. difference English


版权申明

知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。 转载文章请注明原文出处。

天道酬勤
评分4.8/5 based on 20