Python自动化测试常见面试题(四)
2019/08/21 15:25 分类: 技术交流 浏览:1
一、_ init _ _ 和 _ _ new _ _是什么?
1.1、概述
在python的面向对象中,利用new方法创建对象,然后把这个创建的对象传递到init函数中,以第一个参数进
1.2、详细描述
__new__
- 所有的类上都有一个new方法
- 调用时机: 新建对象的时候自动调用(init之前),同时会自动传入类cls参数
- 作用: 改变对象空间的创建过程
- class Person(object):
- def __new__(cls):
- print("__new__方法被调用")
- # 必须返回创建的对象
- # print(cls)
- #return object.__new__(cls) #父类上的__new__方法能够实现内存空间的开辟
- return super().__new__(cls) #父类上的__new__方法能够实现内存空间的开辟
- def __init__(self):
- print("__init__方法被调用")
- # 创建对象
- zhangsan = Person()
__init___
- 定义在类中, 名字固定 init。
- 执行时机: 实例化对象的时候自动调用执行
- 作用: 一般会在初始化方法中 为对象添加(绑定)属性
- class Student(object):
- # 属性
- # 方法
- ## 自己定义一个初始化方法
- def __init__(self,_name,_age):
- # 输出
- print("我自动被调用")
- # 添加属性
- # self.name = "张三"
- # self.age = 26
- self.name = _name
- self.age = _age
- def learn(self):
- print("努力学习,天天向上")
- # 实例化对象
- stu1 = Student(_age=28,_name="李四")
1.3、应用场景
所谓单例就是一个类从始至终只能产生一个实例。
- class Singleton(object):
- __instance = None #私有类属性,保存创建的对象空间
- __isInit = False # 是否已经初始化
- def __new__(cls, *args, **kwargs):
- # 实现自己对象的创建过程
- if not cls.__instance:
- # 没有就创建
- cls.__instance = super().__new__(cls)
- # 返回
- return cls.__instance
- else:
- # 有直接返回
- return cls.__instance
- def __init__(self,name,age):
- if not self.__isInit: #没有初始化
- # 初始化
- self.name = name
- self.age = age
- # 改变
- self.__isInit = True
- else:
- #
- pass
二、什么是pass,什么是lambda函数
2.1、概述
- lambda 创建匿名函数的语法。
- pass 空语句。
2.2、详细描述
1、pass的作用
不做任何事情,一般用做占位语句,为了保证程序的完整性。
2、lambda
lambda只是一个表达式,函数体比def简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- # 可写函数说明
- sum = lambda arg1, arg2: arg1 + arg2;
- # 调用sum函数
- print "相加后的值为 : ", sum( 10, 20 )
- print "相加后的值为 : ", sum( 20, 20 )
2.3、应用场景
lambda创建的匿名函数一般在 排序,map,reduce,filter这些高阶函数里,可以一行写完,不过这个也要看情况,过多使用匿名函 数,在团队代码阅读上,可能会有麻烦。
- >>>def square(x) : # 计算平方数
- ... return x ** 2
- ...
- >>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
- >>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
- [1, 4, 9, 16, 25]
- # 提供了两个列表,对相同位置的列表数据进行相加
- >>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
- [3, 7, 11, 15, 19]
- # 过滤出列表中的所有奇数:
- newlist = filter(lambda x:x % 2 == 1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
- print(newlist)
三、is和==有什么区别?
3.1、概述
is 比较 的是两个实例对象是不是同一个对象,也就是说这两个对象的地址,通过id()函数可以获取,是不是相同。
== 比较的是两个实例对象的值是否相等,比较的是内存中存放的内容,可以不是同一个对象,只要内容一样就可以了。
3.2、详细描述
- x = [1, 2, 3]
- y = x
- z = [1, 2, 3]
- print(x == y)
- print(x is y)
- print(x == z)
- print(x is z)
- 结果:
- True
- True
- True
- False
3.3、应用场景
is常用的地方是: 和None值进行比较 a is None 或者 a is not None
None
在 Python 语言中是一个单例对象,如果你要判断某个变量是否为 None
时,记得使用 is
而不是 ==
,因为只有 is
才能在严格意义上表示某个变量是否是 None
。
赞 0