您的位置:首页 > 编程语言 > Python开发

171111 Learning Python Chapter 25 OOP-The Big Picture

2017-11-11 20:52 609 查看
:同函数和模块一样,类是封装逻辑(函数)与数据的另外一种方式。

为什么选用类?

继承

组合

多重组合

通过继承进行定制

运算符重载





属性继承搜索

超类
↑
类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)模型非常简单,及时在对象树中搜索属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: