昨天还学习了一下python类的用法
1.类的定义
类一般用class定义,通用习惯为首字母大写,在python3中继承object类,什么是继承object类,我在知乎上找到了答案
继承 object 类的是新式类,不继承 object 类的是经典类,在 Python 2.7 里面新式类和经典类在多继承方面会有差异:
class A: def foo(self): print('called A.foo()') class B(A): pass class C(A): def foo(self): print('called C.foo()') class D(B, C): pass if __name__ == '__main__': d = D() d.foo()
B、C 是 A 的子类,D 多继承了 B、C 两个类,其中 C 重写了 A 中的 foo() 方法。
如果 A 是经典类(如上代码),当调用 D 的实例的 foo() 方法时,Python 会按照深度优先的方法去搜索 foo() ,路径是 B-A-C ,执行的是 A 中的 foo() ;
如果 A 是新式类,当调用 D 的实例的 foo() 方法时,Python 会按照广度优先的方法去搜索 foo() ,路径是 B-C-A ,执行的是 C 中的 foo() 。
因为 D 是直接继承 C 的,从逻辑上说,执行 C 中的 foo() 更加合理,因此新式类对多继承的处理更为合乎逻辑。
在 Python 3.x 中的新式类貌似已经兼容了经典类,无论 A 是否继承 object 类, D 实例中的 foo() 都会执行 C 中的 foo() 。但是在 Python 2.7 中这种差异仍然存在,因此还是推荐使用新式类,要继承 object 类。
类是模板,而实例则是根据类创建的对象。如何创建类和实例的语法如下,例如我们创造一个Bike类和叫giant和canyon的实例,giant和canyon都是自行车的一种。
class Bike(object): #创建Bike类,Bike为类名
pass #用在空函数中表占位,不可缺省
giant=Bike() #创造名字为giant的实例
canyon=Bike() #创建名字为canyon的实例
2.实例属性与类属性
实例属性用于区分不同的实例; 类属性是每个实例的共有属性。 好比每种自行车(如上文中的giant和canyon)都有车轱辘但他们的涂装各不相同,在这里实例属性就是涂装,类属性是车轱辘。在上文中我们创造了Bike类那么我们下一步就是对他进行初始化,我们为Bike类添加一个_init_(),方法当创建实例时,_init_()方法被自动调用为创建的实例增加实例属性。
class Bike(object): #创建Bike类,Bike为类名
def __init__(self, color): # 初始化一个属性color
self.color = color # 表示给我们将为创建的实例属性color赋值
注意:_init_(self,color)中第一个参数必须为self,self代表类的实例,是通过类创建的实例 (定义类时这个实例我们还没有创建,它表示的我们使用类时创建的那个实例 ),可以用别的名字,但建议使用约定成俗的self ,后续参数则可以自由指定,和定义函数没有任何区别
类属性为所有实例共享的属性,如果在类上绑定属性,则所有实例都可以访问该类的属性,并且所有实例访问的类属性都是同一个 。车轱辘是BIke的共有属性,每个Bike都有两个车轱辘:
class Bike(object): # 创建Bike类,Bike为类名
wheel = 3.14 # 有两个车轱辘,类属性
def __init__(self, color): # 初始化一个实例属性color
self.color = color # 表示给我们将为创建的实例属性color赋值
giant=Bike(red)
canyon=Bike(blue)
print('----未修改前-----')
print('wheel=\t', Bike.wheel)
print('giant.wheel=\t', giant.wheel) # 2
print('canyon.wheel=\t', canyon.wheel) # 2
print('----通过类名修改后-----')
Bike.wheel = 4 # 通过类名修改类属性,所有实例的类属性被改变
print('wheel=\t', Bike.wheel)
print('giant.wheel=\t', giant.wheel) # 4
print('canyon.wheel=\t', canyon.wheel) # 4
print('----通过circle1实例名修改后-----')
giant.wheel=6 # 实际上这里是给giant创建了一个与类属性同名的实例属性
print('wheel=\t', Bike.wheel) # 4
print('giant.wheel=\t', giant.wheel) # 实例属性的访问优先级比类属性高,所以是6
print('canyon.wheel=\t', canyon.wheel) # 4
注意:不可以用实例修改类属性!!!不可以用实例修改类属性!!!不可以用实例修改类属性!!!
数组:很简单,简单记一下使用方法
import numpy as np
A1=np.array([100,99,98]) #创建一维数组
A2=np.array([[100,99,98],[97,96,95],[94,93,92]]) #创造二维数组
A3=np.array([[[100,98,97],[96,95,94],[93,92,91]],[[90,89,88],[87,86,85]]]) #创建三维数组
print('三维数组中的第三维',A3[0])
print('三维数组中的第二维',A3[0][0])
print('三维数组中的第一维',A3[0][0][0])
树:树是指至少具有一个根节点(Root)的树状结构的数据集合,节点之间具有层次关系。该树结构根节点在上,其他节点在下,底下的节点为叶子节点(Leaf),看起来像一棵倒挂的树。
1.树节点的特点
- 只有一个根节点。
- 每个节点有多个子节点或零个子节点。
- 子节点又可以有多个子节点或零个子节点。
- 底下的节点为叶子节点。
- 任意一个子节点的上一个节点称为父节点。
- 树的局部几个节点可以构成一个子树。
- 层(Level)指根节点为1层,则它的子节点为2层,子节点的子节点为3层,以此推,直到底叶子层。一棵树的最大层数为该树的高度(Height)或深度(Depth)。
2.树分类
树根据子节点之间是否有顺序可以分为无序树、有序树。
-
无序树(又称自由树)是指任意节点的子节点之间没有顺序关系。
-
有序树是指任意节点的子节点之间有顺序关系。
根据节点最多有几个子节点,可以分为二叉树(Binary Tree)和非二叉树。
-
二叉树是指每个节点最多只有两个子节点的数据结构。
-
非二叉树就是不是二叉树的树
3.二叉树特点
- 在i层上至多有2(i-1)个节点(i≥1),如第2层的节点数为22-1=2。
- 深度为d的二叉树至多有2d-1个节点(d≥1),如深度为d=3的二叉树的最多节点是23-1=7。