-
句柄
英文称之为Handle,也就是“柄”的意思,在CS中被称之为句柄,形象化的来说,用一个小东西来拎起来一大串东西,是不是很像一个“柄”。
句柄的存在实际上代表了一种映射的关系,它并不是指针,可以指向一个实际的地址或者对象,但是可以根据句柄在存储空间中进行查找。 -
哈希性
通俗但不太严谨的说法就是,一个对象在其生命周期内如果保持不变,就是可哈希的,每个可哈希的对象都内置了__hash__
方法,所以可哈希的对象可以通过哈希值进行对比,也可以作为字典的键值和作为set函数的参数.
我们常说的可哈希类型就是不可变的数据类型,比如字符串、元祖。而不可哈希的数据类型就是可变的数据类型,比如列表、字典。
字典中的key
就是一种哈希数据类型,我们可以通过key
来进行对value
的搜索,期望的时间复杂度为O(1),而由于哈希对相同的键生成的地址都是一样的,这也就要求字典中的key
必须是可哈希的。
而在python中,我们可以通过函数hash()
来获取一个对象的哈希值。 -
何为Pythonic?
这更像是一种见仁见智的只可意会的“玄学”,实际上指的是在保证实现功能和易读性的基础上,使用python自己的语法,尽可能的使代码更加精简、更加优雅。比如语法糖with
,列表表达式、迭代器、装饰器等等。。。 -
Python池化
一般来说,Python中创建新对象的时候,都会开辟出一个新的内存以供使用,这样在某些情况下会造成内存的浪费。所以Python中使用了池化(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
-
新式类和旧式类的区别:
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
也能完美体现其实际意义。