类:同函数和模块一样,类是封装逻辑(函数)与数据的另外一种方式。
- 为什么选用类?
- 继承
- 组合
- 多重组合
- 通过继承进行定制
- 运算符重载
属性继承搜索
超类
↑
类1-类2
↑
对象1-对象2
object.attribute:
由对象出发,自下而上,自左向右
逐层向上搜索树,寻找属性名称出现的最低(最后更新定义或修改)的地方。
代码隐藏了这种数的形状。
I2.w→C3.w:
I2→C1→C2→C3:自下而上,自左向右,找到首个w即停止,找不到w就报错。
将I2.W解析为C3.w
多重继承的时候,左右顺序的定义如下
Class C2:
Class C3:
Class C1(C2,C3)
类和实例
- 类和实例的主要差异:类是一个产生实例的工厂。
- 实例则有数据项,即带有数据的记录
- 类通常有函数,即处理记录的“程序”
- 类和模板的主要差异:模板在内存空间中只有一个实例,而类可以依据需要任意增加。
类方法的调用
I2.w即“调用C3.w函数处理I2”,也就是说I2.w( )会调用映射C3.w(I2)调用,
传入【该隐含的实例作为继承的函数的第一个参数**】。
Python把隐含的实例传进方法中的第一个特殊的参数,习惯上将其称为self。
编写类树
class C2:... # make class objects
class C3:...
class C1(C2,C3):... # Linked to superclass
I1=C1() # Make istance objects
I2=C2()
- 类在圆括号中由左至右列出的顺序,会决定其在类树中由左至右的搜索的顺序。
当def出现在Class类的内部的时候,通常称为方法,而且会自动接收第一个特殊参数self
Python中的self相当于C++中的指针
self自动引用正在处理的实例
class C1( ):
def setname(self,who):
self.name = who
I1 = C1( )
I2 = C1( )
I1.setname('bob')
I2.setname('mel')
print(I1.name)
print(I2.name)
bob
mel
在Python类中,初始化解析表达式-构造函数 __init__, 在实例调用的时候,类名**括号后的对象属性值**C1(‘Bob’),自动赋予给了当前的对象
传入__init__的第一个参数是新的实例对象自身即self
传入__init__的第二个参数是创建实例对象时括号内的具体属性值
- 如果类中编写或继承了_init_方法,则每次类实例创建时,Python会自动调用它。
- 如果没有_init_方法,实例刚创建时就是一个简单的空的命名空间
- self是第一参数,后面的是第二,第三,…参数
class C1( ):
def __init__(self,who,how):
self.name = who
self.grade = how
I1 = C1('Bob','98')
I2 = C1('Mel','97')
print(I1.name,I1.grade)
print(I2.name,I2.grade)
Bob 98
Mel 97
小结:在深入学习Python类的时候,要记住Python的OOP(Object-Oriented Programming)模型非常简单,及时在对象树中搜索属性。