1.python垃圾回收机制
python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略。
2.魔法函数
定义:
1.在python中以双下滑线开头并且以双下滑线结尾的函数。
2.魔法函数可以随意定义某个类的特性,这些方法在进行特定的操作时会自动被调用,python当中本身就定义了很多内置魔法函数,以下代码举例说明。
3.代码示例:
class ClassRoom(object):
def __init__(self, student_list):
self.student = student_list
def __getitem__(self, item):
return self.student[item]
classRoom = ClassRoom(['zhangs', 'lis', 'wangw'])
#例如遍历classRoom的时候会自动调用__getitem__,item是下标。注意重点,是自动被调用。
for stu in classRoom:
print(stu)
3.如何判断一个对象是函数还是方法
类外面定义的为函数,类里面定义的为方法
from types import MethodType, FunctionType
class Test:
def methodDemo(self):
print('i am methon')
def functionDemo(self):
print('i am function')
if __name__ == '__main__':
print("functionDemo say", isinstance(functionDemo, FunctionType)) #True
print("methodDemo say", isinstance(Test().methodDemo, MethodType))#True
4.普通方法和@classmethod(类方法)和@staticmethod(静态方法)的区别
实例变量:属于每一个实例的那份内存
类变量:公共的内存
4.1普通方法:
定义时,必须把self作为第一个参数,可以访问实例变量,只能通过实例名访问
4.2类方法:
定义时,必须把cls作为第一个参数,可以访问类变量,可以通过实例名或者类名访问
4.3静态方法:
不强制传入self或者cls,可以通过实例名或者类名访问
5.python中的接口类
和Java中一样,定义了一个接口类以后,实现了这个接口的类就要实现接口类中所有的方法
6.python中的反射
定义:
需要执行对象里的某个方法,或需要调用对象中的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在,这是我们需要用
一个特殊的方法或机制要访问和操作这个未知的方法或变量,这时候机制就称之为反射
常用的几个重要方法如下:
hasattr:判断对象中是否有这个方法或变量。
getattr:获取对象中的方法或变量的内存地址。
setattr:为对象添加变量或方法。
delattr:删除对象中的变量。注意啊不能用于删除方法。
7.Python的传参是传值还是传址(内存地址)
不可变参数用值传递(数字,字符串,元组)
可变参数是引用传递(列表,字典)
java中基本数据类型是值传递,引用类型变量为地址传递。
8.any()和 all()方法的用法
if __name__ == '__main__':
#不全为(空,0,False),则返回True
print(any(['',1,False])) #True
print(any(('',0,False))) #False
print(any([])) # False
print(any(())) # False
#全不为(空,0,False),则返回True
print(all(['1', 1, 2])) # True
print(all(('', 1, False))) # False
#这里需要注意的是,空tuple和空list的返回值是True
print(all([])) #True
print(all(())) #True
9.用filter 方法找出列表中所有的奇数
if __name__ == '__main__':
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#该接收两个参数,第一个为函数,第二个为序列
b = filter(lambda num: num % 2 != 0, a)
print(type(b)) #<class 'filter'>
newList = [i for i in b]
print(type(newList)) #<class 'list'>
for i in newList:
print(i)
10.简述猴子补丁
我的理解是在不改变源代码的情况下,在运行时动态改变类或模块,以达到自己想要的效果。
import requests
def get_page(url):
try:
#这里调用的是我们写的get函数,
#只是动态改变了源代码,而真正磁盘上的源代码是不变的
s = requests.get(url)
except requests.HTTPError as e:
print("HTTPError")
def get(url):
raise requests.HTTPError
if __name__ == '__main__':
requests.get = get # 猴子补丁
get_page("111")