网易互娱 游戏研发 暑期实习面试面经

昨天面了网易互娱的游戏研发工程师,回想下似乎问的问题并不多,整体也就 5 个问题,但每个问题展开之后里面的量好像也不少,现在整理一下,顺便解决下面试中没答上来的地方。

面试题

先是自我介绍。。。。。面试官了解到我对 Python 更加熟悉一些,于是问了比较多的 Python 相关的问题。

Python 中如何实现类成员的 public、private、protected

面试官:在 C++、Java中,定义一个类,其成员可以申明为 public、private、protected, 那么在Python 中如何实现类成员的 public、private、protected
答:Python 语言并不存在控制访问,所以无法直接定义类成员的 pubilc、private等属性,一般情况下是通过命名规约来达到这个效果,对于 private 的成员,一般命名以 _ 开头,而 public 的则正常命名即可。

面试官:那对于双下划线__开头的成员呢?

答:双下划线开头的成员感觉主要是用在类的继承的时候,如果不想子类直接访问到父类的这个成员,则可以以双下滑线开头。(修正,不仅仅是继承的时候,在该类中定义了双下划线开头的成员,实例化的对象也无法直接访问该成员)

面试官:如果我访问了这个双下划线开头的成员,会报什么错误?

这里我突然就愣住了,因为之前都没去尝试过,愣了一会儿之后,面试官给了些提示,如果你访问一个变量,但这个变量没有定义的话,那会报什么错误?

答:应该是变量不存在吧

面试官:那上面那个问题是报什么错误呢?

答:这么一说感觉应该是变量不存在

面试官:那再问问如果我非要访问这个双下滑线开头的成员,要怎么做?

这里真就不会了 orz

现在来补一下

''' @Description: @Author: 妄想 @Date: 2020-05-29 15:28:30 @LastEditTime: 2020-05-29 15:32:52 @LastEditors: 妄想 ''' class base: def __init__(self): self.public = 1 self._internal = 2 self.__private = 3 def public_method(self): print('public method') def _internal_method(self): print('internal method') def __private_method(self): print('private method') b = base() print(b.public) print(b._internal) print(b.__private)

运行一下

网易互娱 游戏研发 暑期实习面试面经

那我该如何访问它呢?查了下资料,发现双下划线开头的成员,会被重命名,变成 _类名 + 成员名,在这里就是b._base__private

print(b.public) print(b._internal) print(b._base__private)

函数也是类似

python 修饰器

面试官:了解过修饰器吗?

答:了解过

面试官:介绍下 Python 中修饰器(问题大概就是这个意思吧)

答:balabalabala。。。。(大致意思就是减少代码重复,封装成装饰器方便使用,类似于函数)

面试官:那一个装饰器的输入和输出是什么呢?

答:输入?可以是任意的参数吧,这个不是根据实际定义的吗?(这里我理解错了面试官的意思了- - ,因为之前在做 web 后端的时候,用了修饰器来做 token 验证,当时将 token 作为一个参数使用了)后面在面试官的引导下,反应过来了,输入和输出都是函数。

面试官:如果我不采用 @修饰器名称 的方式来调用修饰器,那该怎么做?

答:我印象中是直接当做函数调用就好了,但是好像并没成功 orz 。。

先来个一般写法

def foo(f): def inner(): print('inner') return f return inner @foo def bar(): pass bar()

会发现输出了 inner,然后我当时写了这样的调用

def foo(f): def inner(): print('inner') return f return inner def bar(): pass foo(bar)

发现没输出 orz, 然后就过去了,后来仔细想想,虽说返回的是函数,但只是这个函数名啊,我并没有调用它哪来的输出啊,菜哭。。

改成这样就好了

bar = foo(bar) bar() # 或 foo(bar)() python 迭代器

面试官:了解过迭代器吗?可以介绍下吗?

答:迭代器一般是用在对 Python 中的数据结构进行遍历,比如我现在有一个名为 li 的 List,我想对里面每个元素进行修改,那就需要遍历每个元素,这时通过 for number in li: 这条语句,便会生成一个迭代器,然后 number 为当前所在位置的元素。

面试官:那这跟直接索引遍历相比的好处是什么?

答:(这里凭感觉答的,也不清楚对不对)1. 按索引遍历的话首先需要知道这个数据结构的长度。2. 每次遍历的时候都需要通过索引来获取这个数据,而通过迭代器可直接获取到数据。

面试官:那有没有什么情况下是不能使用迭代器的呢?

答:这里我觉得存在删除操作的时候应该是不能使用迭代器的,如下面这段代码, 我想删除列表中大于 3 的元素

li = [1, 2, 3, 4, 5, 1, 4] for i in li: if i > 3: li.remove(i) print(li)

输出一下发现结果为 [1, 2, 3, 5, 1]

面试官:那添加的时候呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgfgy.html