• Python 2.x中,声明类时,通过公有继承一个名为object的类,说明声明的类是“新式”的类。Python3中,所有类默认继承了object,再写一个继承自object就算是可选的写法了。
  • class声明中,__init__(self)就相当于是C++的默认构造函数。可以往里面写参数,如__init__(self, dogs),像C++的自定义构造函数。
  • Python像是没有C++的隐式this指针转换,只要是引用到调用者自身拥有的属性,都要用self.去表达与this->等价的语义。
  • Python的类属性定义很随意,一个成员函数出现的标识符,可以在另一个成员函数直接引用。
  • Python中,对类成员函数调用,是按照这个顺序去处理:
    • 首先找到调用者的最新定义。
    • 然后对点号之后的函数,查找调用者所属类的类声明。
    • 如果存在匹配的函数,则把原先的类成员函数调用转换成foo(caller_identifier, …)的形式,就是一定要加上调用者,作为第一个参数。
  • Python里的公有继承语法,就是将父类的名字直接写到子类的第一行括号里,如下:
class derived(ancestor):
  • Python2.x中,print被作为对象,而不是函数对待的,从而使用如sep、end之类的参数,会报错。解决方式就是在代码开头加上如下代码:
from __future__ import print_function

因为有一些支持Python的OJ还是使用2.x版本,所以个处理方式值得记忆一下。

  • urlopen函数定义在urllib.request模块中。该函数接受一个直接表示资源地址的url,返回一个文件对象,可以把这个远程资源当成本地文件一样进行读操作。
  • random.sample()接受一个list和一个整数n,从list中随机返回长为n的片段。
  • random.ranint()接受两个整数值a、b,随机返回一个[a, b]之间的整数。
  • list复制。
a = [1, 2, 3]
b = a
b[0] = [3]
a
b

interactive mode中运行后,最后两行的结果是

[3, 2, 3]
[3, 2, 3]

说明b = a执行的是浅拷贝。

如果想达成深拷贝的效果,则有两种方式:

a = [1, 2, 3]
b = a[:]
b[0] = 3
a
b

最后两行的执行结果是

[1, 2, 3]
[3, 2, 3]

说明该写法中,执行了深拷贝。

a = [1, 2, 3]
b = list(a)
b[0] = 3
a
b

该写法与b = a[:]等价。

  • 子类的__init__函数中,使用super().__init__(self),类似C++中子类构造函数里调用基类构造函数。