1.python常用魔法函数
__init__(): 所有类的超类object,都有一个默认包含pass的__init__()实现,这个函数会在初始化的时候调用 __str__(): 直接打印对象的实现方法,__str__是被print函数调用的 __unicode__(): 在django中,虽然没有定义__str__,但是django会将__unicode__转为了str,当然你调用unicode更加是没有问题的。 __call__(): 对象通过提供__call__()方法可以模拟函数的行为,如果一个对象提供了该方法,就可以像函数一样使用它 __len__(): 调用后会调用对象的__len__函数,我们可以为其定制输出 __repr__(): 函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式,某对象没有适于人阅读的解释形式的话,str() 会返回与repr(),所以print展示的都是str的格式 __setarrt__(): __new__(): __getattr__(): __getattribute__(): __delattr__(): __setitem__(): __delitem__(): __iter__(): 可以使用迭代器访问 __del__():
2.如何判断是函数还是方法?
函数:
函数是封装了一些独特功能,可以被直接调用
方法:
方法和函数类似,同样封装了独立的功能,但是方法是需要通过对象来调用的。
3.静态方法和类方法区别?
静态方法不需要传入self参数,类成员方法需要传入代表本类的cls参数
静态方法是无妨访问实例变量和类变量的,类方法无法访问实例变量但是可以访问类变量
4.列举面向对象中的特殊成员以及应用场景
__doc__ 描述类的信息
__call__ 对象后面加括号,触发执行
__dict__查看类或对象中的所有成员
5.什么是反射?以及应用场景?
6.metaclass作用?以及应用场景?
7.用尽量多的方法实现单例模式
1.模块单例 python的模块就是天然的单例模式,模块在首次导入时,会生成.pyc文件,当第二次导入时,就会直接加载.pyc文件,而不会再次执行模块代码 class Singleton(object): def foo(self): pass singleton = Singleton() from foo1 import singleton 2.静态变量 先执行了类的__new__方法,实例化对象,然后再执行类的__init__方法,对这个对象进行初始化,所以我们可以基于这个,实现单例模式 class Singleton(object): def __new__(cls,a): if not hasattr(cls, "_instance"): cls._instance = object.__new__(cls) return cls._instance def __init__(self,a): self.a = a def aa(self): print(self.a) a = Singleton("a") 本质上是手动版的__new__方法 3.元类方法 执行元类的__new__方法和__init__方法来实例化类对象,__call__方法用来对实例化的对象的实例也就是累的对象进行控制,__call__方法会调用实例类的__new__方法,用于创建对象。返回对象给__call__方法,然后调用类对象的__init__方法,用于对对象初始化 class Singleton1(type): def __init__(self, *args, **kwargs) self._instance = None super(Singleton1,self).__init__(*args,**kwargs) def __call__(self,*args,**kwargs): if self._instance is None: self.__instance = super(Singleton1,self).__call__(*args,**kwargs) return self.__instance class Singleton2(type): _inst = {} def __call__(cls, *args, **kwargs): print(cls) if cls not in cls._inst: cls._inst[cls] = super(Singleton2,cls).__call__(*args) return cls._inst[cls] class C(metaclass=Singleton1): pass 4.装饰器 装饰器用来控制类调用__call__方法 def singleton(cls,*args,**kwargs) instance = {} def __singleton(args): if cls not in instance: instance[cls] = cls(*args,**kwargs) return instance[cls] return __singleton @singleton class A: pass
8.装饰器的写法以及应用场景
1.授权 装饰器能有助于检查某个人是否被授权去使用一个web应用的端点。 from functools import wraps def requires_auth(f): @wraps(f) def decorated(*args,**kwargs): auth = request.authorization if not auth or not check_auth(auth.username,auth.password): authenticate() return f(*args,**kwargs) return decorated 2.日志 日志是装饰器运用的另一个亮点 from functools import wraps def logit(func): @wraps(func) def with_logging(*args,**kwargs): print(func.__name__ + "was called") return func(*args,**kwargs) return with_logging @logit def addition_func(x): """ Do some math """ return x + x return = addition_func(4) 3.带参数的装饰器 带参数的装饰器是典型的闭包函数 4.在函数中嵌入装饰器 from functools import wraps def logit(logfile='out.log'): def logging_decorator(func): @wraps(func) def wrapped_function(*args,**kwargs): log_string = func.__name__ + "was called" print(log_string) with open(logfile, "a") as opened_file: opened_file.write(log_string + '\n') return func(*args,**kwargs) return wrapped_function return logging_decorator @logit() def myfunc1(): pass myfunc1() # Output: myfunc1 was called # 现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串 @logit(logfile='func2.log') def myfunc2(): pass myfunc2() # Output: myfunc2 was called # 现在一个叫做 func2.log 的文件出现了,里面的内容就是上面的字符串 5.装饰器类
9.异常处理写法以及如何主动抛出异常(应用场景)
class MyException(Exception): def __init__(self,msg): self.msg = msg def __str__(self): return self.msg try: raise MyException("自定义的异常") except MyException as e: print(e) finally: print(123)
10.什么是面向对象的mro
1.python多继承 一个类可以继承多个无关的类,一个类可以被多个无关的类继承 2.经典类的mro 在经典类中采用的是深度优先遍历方案 3.新式类的mro merge方法 class A(O):pass class B(O):pass class C(O):pass class E(A,B):pass class F(B,C):pass class G(E,F):pass mro(G) = [G] + merge(mro[E], mro[F], [E,F]) = [G] + merge([E,A,B,O], [F,B,C,O], [E,F]) = [G,E] + merge([A,B,O], [F,B,C,O], [F]) = [G,E,A] + merge([B,O], [F,B,C,O], [F]) = [G,E,A,F] + merge([B,O], [B,C,O]) = [G,E,A,F,B] + merge([O], [C,O]) = [G,E,A,F,B,C] + merge([O], [O]) = [G,E,A,F,B,C,O] 4.super() super()可以帮我们执行mro下一个父类的方法。通常super()有两个使用的地方 1.可以访问父类的构造方法 2.当子类方法想调用父类(mro)中的方法 super是查找mro顺序中的下一个 单继承中我们可以认为super是对父类中的属性或方法的引入 class Init(object): def __init__(self, v): print("init") self.val = v class Add2(Init): def __init__(self, val): print("Add2") super(Add2, self).__init__(val) print(self.val) self.val += 2 class Mult(Init): def __init__(self, val): print("Mult") super(Mult, self).__init__(val) self.val *= 5 class HaHa(Init): def __init__(self, val): print("哈哈") super(HaHa, self).__init__(val) self.val /= 5 class Pro(Add2,Mult,HaHa): # pass class Incr(Pro): def __init__(self, val): super(Incr, self).__init__(val) self.val+= 1 # Incr Pro Add2 Mult HaHa Init p = Incr(5) print(p.val) c = Add2(2) print(c.val) 提示. 先算MRO.然后看清楚self是谁. 结论: 不管super()写在哪儿.在哪儿执行. 一定先找到MRO列表 根据MRO列列表的顺序往下找.否则⼀一切都是错的
11.isinstance作用以及应用场景?
isinstance作用:来判断一个对象是否是一个已知的类型;
12.找到一个数组中两个值得和等于固定值(target)返回这俩值得索引
def twoSum(self,nums,target): if len(nums) <= 1: return False buff_dict = {} for i in range(len(nums)): if nums[i] in buff_dict: return [buff_dict[nums[i]],i] else: buff_dict[target - nums[i]] = i
13.json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型
自定义时间序列化转换器 import json from json import JSONEncoder from datetime import datetime class ComplexEncoder(JSONEncoder): def default(self,obj): if isinstance(obj,datetime): return obj.strftime("%Y-%m-%d %H:%M:%S") else: return super(ComplexEncoder,self).dafault(obj) d = {"name":"zhangw","date":datetime.now()} print(json.dumps(d,cls=ComplexEncoder))
14.json序列化时遇到中文会默认转换成unicode ,如何让他保留中文形式
import json a = json.dumps({"ddf":"你好"},ensure_ascii=False) print(a)
15.什么是断言?应用场景?
python的assert是用来检查一个条件,如果它为真,就不做任何事。如果它为假,则 会抛出AssertError并且包含错误信息
防御型编程
运行时检查程序逻辑
检查约定
程序常量
检查文档
16.有用过with statement吗?它的好处是什么?
with语句的作用是通过某种方法简化异常处理,它是所谓的上下文管理器的一种
with语句会在嵌套的代码执行之后,自动关闭文件
17.使用代码实现查看列举目录下的所有文件
import os def dirpath(lpath, lfilelist): list = os.listdir(lpath) for f in list: file = os.path.join(lpath, f) #拼接完整的路径 if os.path.isdir(file): #判断如果为文件夹则进行递归遍历 dirpath(file, lfilelist) else: lfilelist.append(file) return lfilelist lfilelist = dirpath(os.getcwd(), []) for f in lfilelist: print(f)
18.简述 yield和yield from关键字
当一个函数中出现yield关键字时,这个函数就是一个生成器,可以用for循环或者next()函数来迭代 yield可以接收到外界传入的变量 yield from iterable == for item in iterable:yield item