Python基础教程 第七章 更加抽象

2017年11月16日17:32:17
  • Python基础教程 第七章 更加抽象已关闭评论
  • 384 views
  • A+
所属分类:Python基础

7.1对象的魔力

多态(Polymorphism):意味着可以对不同类的对象使用同样的操作,它们会像被“施了 魔法一般”工作。

封装(Encapsulation ):对外部世界隐藏对象的工作细节。

继承(Inheritance ):以普通的类为基础建立专门的类对象。

 

7.2.2创建自己的类

终于来了!可以创建自己的类了!先来看一个简单的类:

_metaclass_ =type#确定使用断式类

class Person:

def setName(self, name):

self.name二name

def getName(self):

return self.name

def greet(self):

print "Hello, world! I'm %s." % self.name

新式类的语法中,需要在模块或者脚本开始的地方放置赋值语句_metaclass_=type,也有其他的方法,例如继承新式类(比如。bject )

seq = range(1,1000001)
print search(seq,700000)
class test1:
def __add__(self, other):
return 1
def add(self, ss=1):
return ss+ss

test2 = test1()
print test2.add()
print test2.add(33)

显然这就是self的用处和存在的必要性。没有它的话,成员方法就没法访问他们要对其特性进行操作的对象本身了。

 

7.2.3特性、函数和方法

self参数事实上正是方法和函数的区别,Python并不直接支持私有方式,就是可以直接使用 对象名.属性 的方式访问属性,

为了让方法或者属性变为私有(从外部无法访问),只要在它的名字前面加上双下划线即可。

 

7.2.5指定超类

 

7.2.6调查继承

如果想要查看一个类是否是另一个的子类,可以使用内建的issubclass函数:

class Filter:pass

class SPAMFilter(Filter):pass

 

>issubclass(SPAMFilter. Filter)

true

 

如果想要知道已知类的基类(们),可以直接使用它的特殊特性_bases_

>>>SPAMFilter._bases_

同样,还能用使用isinstance方法检查一个对象是否是一个类的实例:

 

>>>s=SPAMFilter()

>>>isinstance(s, SPAMFilter)

True

>>>isinstance(s,Filter)

True

>>>isinstance(s, str)

False

 

注意使用isinstance并不是个好习惯,使用多态会更好一些。

 

 

如果只想知道一个对象属于哪个类,可以使用_class_特性:

s= SPAMFilter()

>>> s. _class_

 

7.2.7多个超类

class Calculator:

def calculate(self, expression):

self.value=eval(expression)

class Talker:

def talk(self):

print 'Hi,my value is', self.value

class TalkingCalculator(Calculator. Talker):

pass

 

 

7.2.8接口和内省

在Python中,不用显式地指定对象必须包含哪些方法才能作为参数接收。例如,不用(像在Java中一样)显式地编写接口,

可以在使用对象的时候假定它可以实现你所要求的行为。如果它不能实现的话,程序就会失败。

一般来说只需要让对象符合当前的接口(换句话说就是实现当前方法),但是还可以更灵活一些。

除了调用方法然后期待一切顺利之外,还可检查所需方法是否已经存在—如果不存在,就需要做些其他事情:

 

callable函数

用来判断如果对象object参数是可以调用的对象,就返回True;否则返回False;同时如果类对象是一个类对象,那么这个类是否重载有__call__()方法来决定,如果重载有这个方法就判断为True

callable函数在Python 3.0中已不再可用。可以使用hasattr(x,'_call_')来代替callable(x).

 

tc=TalkingCalculator()

hasattr(tc. 'talk')

True

 

 

getattr函数,能检查talk特性是否可调用,该函数允许提供默认值(本例中为None)

>>>callable(getattr(tc. 'talk'. None))

True

 

与getattr相对应的函数足setattr,可以用来设置对象的特性;

>>>setattr(tc. 'name','Mr. Gumby')

>>>tc.name

'Mr. Gumby'

 

 

对象。对象包括特性和方法。特性只是作为对象的一部分的变量,方法则是存储在对象内的

函数。(绑定)方法和其他函数的区别在于方法总是将对象作为自己的第一个参数,这个参数一

般称为self

类。类代表对象的集合(或一类对象),每个对象(实例)都有一个类。类的主要任务是定

义它的实例会用到的方法。

多态。多态是实现将不同类型和类的对象进行同样对待的特性—不需要知道对象属于哪个

类就能调用方法。

封装。对象可以将它们的内部状态隐藏(或封装)起来。在一些语言中,这意味着对象的状

态(特性)只对自己的方法可用。在Python中,所有的特性都是公开可用的,但是程序员应该在

直接访问对象状态时谨慎行事,因为他们可能无意中使得这些特性在某些方面不一致。

继承。一个类可以是一个或者多个类的子类。子类从超类继承所有方法。可以使用多个超类,

这个特性可以用来组成功能的正交部分(没有任何联系)。普通的实现方式是使用核心的超类和

一个或者多个混合的超类。

接口和内省。一般来说,对于对象不用探讨过深。程序员可以靠多态调用自己需要的方法。

不过如果想要知道对象到底有什么方法和特性,有些函数可以帮助完成这项工作。

面向对象设计。关于如何(或者说是否应该进行)面向对象设计有很多的观点。不管你持什

么观点,完全理解这个问题,并且创建容易理解的设计是很重要的。

 

 

 

    表7-7本章的新函数

函数描述

callable(object)确定对象是否可调用(比如函数或者方法)

getattr(object. nameC. default])确定特性的值,可选择提供默认值

hasattr(object. name)确定对象是否有给定的特性

setattr(object. name. value)设定对象的给定特性为value

isinstance(object, class)确定对象是否是类的实例

issubclass(A, B)确定A是否为B的子类

random.choice(sequence)从非空序列中随机选择元素

type(object)返回对象的类型

 

 

 

 

 

 

 

 

 

 

 

avatar