python面试之高级特性

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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值