Python面试题思考-2

  • 句柄
    英文称之为Handle,也就是“柄”的意思,在CS中被称之为句柄,形象化的来说,用一个小东西来拎起来一大串东西,是不是很像一个“柄”。
    句柄的存在实际上代表了一种映射的关系,它并不是指针,可以指向一个实际的地址或者对象,但是可以根据句柄在存储空间中进行查找。

  • 哈希性
    通俗但不太严谨的说法就是,一个对象在其生命周期内如果保持不变,就是可哈希的,每个可哈希的对象都内置了__hash__方法,所以可哈希的对象可以通过哈希值进行对比,也可以作为字典的键值和作为set函数的参数.
    我们常说的可哈希类型就是不可变的数据类型,比如字符串、元祖。而不可哈希的数据类型就是可变的数据类型,比如列表、字典。
    字典中的key就是一种哈希数据类型,我们可以通过key来进行对value的搜索,期望的时间复杂度为O(1),而由于哈希对相同的键生成的地址都是一样的,这也就要求字典中的key必须是可哈希的。
    而在python中,我们可以通过函数hash()来获取一个对象的哈希值。

  • 何为Pythonic?
    这更像是一种见仁见智的只可意会的“玄学”,实际上指的是在保证实现功能和易读性的基础上,使用python自己的语法,尽可能的使代码更加精简、更加优雅。比如语法糖with,列表表达式、迭代器、装饰器等等。。。

  • Python池化
    一般来说,Python中创建新对象的时候,都会开辟出一个新的内存以供使用,这样在某些情况下会造成内存的浪费。所以Python中使用了池化(intern)的概念,通俗一点来讲就是,如果我们重复定义了相同值的字符串对象,则在字符串池中只保存一个对象,我们在使用该值的时候只需要对其进行调用即可,这样的话,避免了对相同对象的内存重复开辟、对象的频繁创建、销毁等操作,不仅仅提高了操作效率,还节约了大量内存。

字符串池化(intern)机制及拓展学习

⚠️:
python规定只有包含下划线、数字、字母的字符串才会被intern;
python规定了[-5,257)的范围内为小整数池,而针对大整数还是在每次使用的时候均会创建一个新的对象;

   >>> a = 'hello'
   >>> b = 'hello'
   >>> a is b
   True
   >>> a = 'hello world'
   >>> b = 'hello world'
   >>> a is b
   False

**问题:**在IDE(Pycharm)中进行hello world的测试,但是其输出为True,针对这个问题,在这里有人给出答案,但是其中用词并不肯定,还有待确认。

  • 面向对象的MRO
    方法解析顺序(Method Resolution Order-MRO),是指在在python中出现了多重继承的时候,且继承的情况较为复杂,我们可以使用mro方法来理清其继承关系,在Python的旧式类中,方法解析顺序是深度优先,多个父类从左到右。而在新式类中,方法解析的顺序是广度优先 ,多个父类从左到右。
    在下面的代码示例中,解析顺序为A -> B -> C -> D -> object
   class D(object):
   
       def test(self):
           print('test in D')
   
   class C(D):
       
       def test(self):
           print('test in C')
   
   class B(D):
       
       def test(self):
           print('test in B')
   
   class A(B, C):
       pass

Python进阶-继承中的MRO与super

  • 新式类和旧式类的区别:
    1、在python2.x中默认是旧式类,在python3.x中默认是新式类
    2、新式类显式的继承了object,而object作为python内置定义的一个基类,拥有很多高级特性,在被继承后可以使用。
    3、mro的算法不同,新式类使用C3算法广度优先算法,旧式类使用深度优先算法。
    4、新式类相同父类只执行一次构造函数,经典类重复执行多次。

  • 绑定方法与非绑定方法:
    想要理解self,首先需要了解绑定方法与非绑定方法。我们在定义一个类的时候,其中定义的方法为非绑定方法(函数),这样其任何实例化的对象都可以使用该方法。而在实例化该类后,实力对象对其自身的方法使用,被称之为绑定方法(方法)。

   class Person:
   school = 'Whu University' # 类属性绑定
   
   def __init__(self, name, age):
       self.name = name # 实例属性绑定
       self.age = age # 实例属性绑定
   
   def print_info(self): # 暴露公共接口
       print(self.name, self.age)

   p = Person('Richard', 20)
   p.print_info()

我们可以直观看到二者的不同:

   <function Person.print_info at 0x006E2AE0>
<bound method Person.print_info of <__main__.Person object at 0x006E0E10>>
  • self:
    了解了绑定与非绑定的方法,我们再来看一下self这个参数,在调用绑定方法的时候,调用实例对象会被Python解释器作为第一个参数来调用绑定方法。所以我们可以看出,重要并不是这个参数的名字,而是这个参数的位置,而self也能完美体现其实际意义。

Python基础-类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值