Python基础编程(七)更加抽象

7.1 对象的魔力

多态:意味着可以对不同类的对象使用同样的操作。
封装:对外部世界隐藏对象的工作细节。
继承:以普通的类为基础建立专门的对象。

7.1.1 多态

多态意味着就算不知道变量所应用的对象类型是什么,还是能对他进行操作,而他也会根据对象(或类)类型的不同而表现出不同的行为。

2. 多态的多种形式

任何不知道对象到底是什么类型,但是又要对对象“做点什么”的时候,就会用到多态。

7.1.2 封装

堕胎可以让用户对于不知道是什么类(或对象类型)的对象进行方法调用,而封装是可以不用关心对象是如何构建的而直接进行使用。

7.2 类和类型

子类,超类。
_mataclass_ = type 
class Person:
      def setName(self,name)
          self.name = name
      def getName(self)
          return self.name
      def greet(self)
          print "Hello,word! I'm %s." % self.name
self是对于对象自身的引用:
>>> foo = Person()
>>> foo.setName('Luke Skywalker')
>>> foo.greet()
Hello,word! I'm Luke Skywalker.
在调用foo的setName和greet函数时,foo自动将自己作为第一个参数传入参数中——因此形象的命名为self。

7.2.3 特性、函数和方法

self参数事实上正是方法和函数的区别。方法将它们的第一个参数绑定在所属的实例上,因此这个参数可以不必提供。
>>> class Class:
             def mathod(self):
                 print 'I have a self!'
>>> def function():
          print "I don't..."
>>> instance = Class()
>>> instance.method()
I have a self!
>>> instance.method = function
>>> instance.method()
Idon't...
注意,self参数并不取决于调用方法的方式,目前使用的实施例调用方法,可以随意引用同一个方法的其他变量:
>>> class Bird:
             song = 'Squaawk!'
             def sing(self):
                 print self.song
>>> bird = Bird()
>>> bird.sing()
Squaawk!
>>> birdsong = bird.sing
>>> birdsong()
Squaawk!
变量birdsong引用绑定方法bird.sing上,这就意味着这还是对self参数的访问(也就是说,他仍就绑定到类的相同实例上)。
Python并不知支持私有方式,而是靠程序员自己把握在外部进行特性修改的时机。毕竟在使用对象前应该知道如何使用。
为了让方法或者特性变成私有,只要在他的名字前面加上双下划线即可。
class Secretive:
      def __inaccessible(self):
          print 'Bet you can'tsee me...'
现在__inaccessible从外界是无法访问的,而在内部还能使用访问。
尽管双下划线有些奇怪,但是看起来像是其他语言中的标准的私有方法,真正发生的事情才不是标准的,类的内部定义中,所有以双下划线开始的名字都被“翻译“成前面加上单下划线和类名的形式。

7.2.4 类的命名空间

7.2.5 指定超类

将其他类写在class语句后的括号内就可以指定超类:
class Fiter:
      def init(delf)
          self.blocked = []
      def filter(self,sequence):
          return [x for x in sequence if x not in self.blocked]
class SPAMFilter(Filter): #SPAMFliter是Fliter的子类
      def init(self):#重写Fiter超类中的init方法
          self.bllocked = ['SPAM']

7.2.6 调查继承

如果想要查看一个类是否是另一个类的子类,可以使用内建的issubclass函数:
>>> issubclass(SPAMFilter)
True
>>> issubclass(Filter,SPAMFilter)
False

7.2.7 多个超类

多重继承。
当使用多重继承时,有个需要注意的地方,如果一个方法是从多个超类继承,那么必须要注意一下超类的顺序:先继承的类中的方法会重写后继承的类中的方法。

7.2.8 接口和内省

























 

posted @ 2014-05-19 16:05  Mave  阅读(229)  评论(0编辑  收藏  举报