Python中的类与OOP

 
Python中一切皆是对象,变量、函数名、类型,...,显然这使得面向对象编程变得更容易也更直观。
类(Class)是面向对象编程的利器,尽管在python中,完全可以不使用类,使用简单的结构如函数(Function)即可以完成大量的工作,然而类无疑是python提供的最有力的编程武器。
通过类的使用,使得继承、多态、运算符重载得以实现。
 
实例对象与类对象
这里说明一下,所谓的实例对象(instance)是指通过对类对象类似于函数般调用得到的对象,
例如:class Cla: ...
         a = Cla()
Cla为类对象,a为类对象生成的实例对象,一个类可以生成多个实例对象。每个实例对象都有自己的名字空间。这里不得不提self,python中属性通过类定义中的语句附加到类对象上,通过self附加到具体对象上。类的属性,只要类内部语句中出现了命名语句如def,=等等都形成类的属性。也可以这样理解:所有实例对象共享类对象中的函数代码,但拥有自己的数据,如果没有self,就不知道要把函数应用到哪个对象的数据上,因此引入self。 举个例子:
class Cla:
      value = 42
      def func(self):
            self.num = 10
这里value、func都是Cla的属性,其中value为所有实例对象所共享,相当于C++中的类static变量,而每一个实例对象都有一个私有的num。
 
继承
面向对象编程的最大好处是可以进行代码复用。你的程序中需要的一些功能可能以前已经有人全部或者实现过了,那么,最简单的便是拿来主义,使用已有的类库。这时,已有的类库或许不能完成你的全部功能,或者提供的一些功能不能满足你的需求,你仅仅需要重写这一部分代码,提供新的接口和实现,而不必重新构建全部。这大大的缩短了开发的周期,而且已有的开源类库往往已经经过了很多人的使用和修改,一般来说比你重写要更健壮也更高效。
继承可以完成以上的功能,子类继承基类的接口和实现,并可以添加新的接口。继承的应用形成了类的层次结构,基类在上层,子类在下层,实际上这就是一棵树。类本身只是生成了新的类型对象,我们主要是在对象的属性上进行操作,形如:object.attribute。对对象属性的正确调用本质上是一个自底向上、自左向右的,树搜索的过程,首次遇到的attribute的出现做为最终调用。自底向上体现在按照实例对象(instance)-->子类对象-->基类对象的顺序进行搜索,自左向右体现在多重继承中,按照继承参数表中先后出现的次序进行搜索。在类层次中,由不同层次的类对象生成的实例,决定了树搜索的不同起点。正是这种机制,使得子类可以通过重新定义同名函数来重载基类中已有的函数,因为在类层次树中搜索某个名字时,自底向上一定先遇到子类中的名字。还要强调的是,与C++不同,python中的重载不是通过对参数表的类型进行判断来决定的,因为python中的变量不需要类型声明,因此完全使这种搜索策略决定的。
多态
在C++中,多态是通过继承、虚函数等机制使得基类指针或引用能够根据所指的具体类型来调用相对应的函数来实现的。在python中多态则完全依赖于对象。
如上面的函数,传递给函数不同的reader对象,函数就调用不同的read()函数。如果reader是类层次中的某个类型的具体实例,那么它将在类层次树中搜索找到第一个出现的read名字。从这个角度说,继承也对多态起到了作用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值