python学习笔记(8)

转载 2015年11月21日 15:40:16

创建自已对象就python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象。以及面向对象的概念:继承、封装、多态。

 

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

多态

面向对象程序设计最有趣的特性是多太,它是是让大多数人犯晕的特性。所以,先来介绍这个。

多态意思是“有多种形式”。多态意味着就算不知道变量所引用的对象类是什么,还是能对它进行操作,而它也会根据对象(或类)类型的不同而表现出不同的行为。

 从最简单的开始

  任何不知道对象到底是什么类型,但是又要对对象“做点什么”的时候,都会用到多态。这不仅限于方法----很多内建运算符和函数都有多态的性质,考虑下面这个例子:

>>> 1 + 2
3
>>> 'fish' + 'license'
'fishlicense'

 这里的加运算符对于数字(本例中为整数)和字符串(以及其他类型的序列)都能起作用。假设有个叫做add的函数,它可以将两个对象相加。那么可以直接将其定义成上面的形式,对于很多类型的参数都可以用,如下:

复制代码
>>> def add(x,y):
    return x+y

>>> add(1,2)
3
>>> add('hello.','world')
'hello.world'
复制代码

看起来有点傻,但是关键在于参数可以是任何支持加法的对象。

 如果需要编写打印对象长度消息的函数,则只需对象具有长度(len函数可用)即可。

复制代码
>>> def length_message(x):
    print"The length of " , repr(x),"is",len(x)

    
>>> length_message('chongshi')
The length of  'chongshi' is 8
>>> length_message([1,2,3])
The length of  [1, 2, 3] is 3
复制代码

len函数用于计算长度,repr用于放置函数的内容;repr函数是多态特性的代表之一---可以对任何东西使用。 

很多函数和运算符都是多态的,你写的绝大多数程序可能都是,即便你并非有意这样。

 封装

 封装是对全局作用域中其它区域隐藏多余信息的原则。

封装听起来有些像多态,因为他们都是 抽象的原则---他们都会帮助处理程序组件而不用过多关心多余细节,就像函数做的一样。

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

创建一个有对象(通过像调用函数一样调用类)后,将变量c绑定到该对象上。可以使用setName 和 getName 方法(假设已经有)

>>> c = closedObject()
>>> c.setName('sir lancelot')
>>> c.getName()
‘sir lancelot’

 继承

我们不想把同一段代码写好几,之前使用的函数避免了这种情况。但现在又有个更微妙的问题。如果已经有了一个类,又想建立一个非常类似的类,只是添加几个方法。

比如有动物类,我们又想在动物类的基础上建立鸟类、鱼类,哺乳动物类。

 上面这些特性会根据后面的学习来深入的理解。

 ================================

 创建自己的类

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

复制代码
_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 。

 

创建了一个Person的类,这个类包含了三个方法定义,只是那个self看起有点奇怪,它是对于对象自身的引用。

让我们创建实例看看:

>>> huhu = Person()
>>> huhu.setName('hu zhiheng')
>>> huhu.greet()
Hello, world! I'm hu zhiheng

应该能说明self的用处了,在调用huhusetName 和 greet 函数时,huhu自动将自己作为第一个参数传入函数中----因此形象地命名为self。每个人可能都会有自己的叫法,但是因为它总是对象自身,所以习惯上总是叫做self 

 

和之前一样,特性也可以在外部访问:

>>> huhu.name
'hu zhiheng'
>>> huhu.name = 'yoda'
>>> huhu.greet()
Hello, world! I'm yoda

 

 特性、函数和方法

 self 参数事实上正是方法和函数的区别。方法将它们的第一个参数绑定到所属的实例上,因此这个参数可以不必提供。所以可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数了:

复制代码
>>> class Class:
    def method(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()
I don't
复制代码

 

self参数并不取决于调用方法的方式,目前使用的是实例调用方法,可以随意使用引用同一个方法的其他变量:

复制代码
>>> class Bird:
    song =  'Squaawk!'
    def sing(self):
        print self.song

        
>>> bird = Bird()
>>> bird.sing()
Squaawk!
>>> birdsong = bird.sing
>>> birdsong()
Squaawk!
复制代码

 指定超类

 

子类可以扩展超类的定义。将其他类名写在class语句后的圆括号内可以指定超类:

复制代码
class Filter:
    def init(self):
        self.blocked = []
    def filter(self , sequence):
        return [x for x in sequence if x not in self.blocked]

class SPAMFilter(Filter):  #SPAMFilter是Filter的子类
    def init(self):        #重写Filter类中的init方法
        self.blocked = ['SPAM']
复制代码

Filter 是个用于过滤序列的通用类,事实上它不能过滤任何东西:

>>> f = Filter()
>>> f.init()
>>> f.filter([1,2,3])
[1, 2, 3]

Filter 类的用户在于它可以用作其他类的基类(超类,“java中叫父类”),比如SPAMFilter类,可以将序列中的“SPAM”过滤出来。

>>> s = SPAMFilter()
>>> s.init()
>>> s.filter(['SPAM','SPAMD','SPAM','HELLO','WORLD','SPAM'])
['SPAMD', 'HELLO', 'WORLD']

 

 调查继承

 

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

>>> issubclass(SPAMFilter, Filter)
True
>>> issubclass(Filter,SPAMFilter)
False

相关文章推荐

IPython下字符串的简单处理 - 千月的python linux 系统管理指南学习笔记(8)

这里仅仅对字符串进行简单处理,实现 shell 一样的功能。 复杂的处理方法,会在后面章节细说。 如果需要在 shell 下得到 Debian-+ 这个特殊用户拥有进程的 PID 方法如下。 ...

《python》学习笔记(Day8),采用MVC模式的Web应用例子(续+)

运行Webapp

python学习笔记3.1-函数

在了解了数据结构之后,就需要编写函数了,函数是最常用的封装代码的方式,将具有特殊功能的代码封装成一个函数,不仅可以多次重复调用,减小编程量,同时还能够使我们的代码变得更加简洁。一个开发人员能够恰当的使...

Python学习笔记 - 8.字典(Dict)

与列表相比的特点:列表中的索引位置必须是整数,而字典中索引几乎可以是任意类型。字典字典可看作是索引(这里称为键)的集合与值的集合之间存在的一种映射。 每个键对应一个值,键与值之间的关系称之为键值对,...

Python学习笔记(8)-变量、地址、id、is与==

一、简介本篇主要介绍Python作为一种动态语言的动态特点、Python的变量保存、以及id()函数和is()函数和==操作符之间爱恨纠缠的关系。二、动态语言首先所谓的动态语言、静态语言,其实就是针对...

【python学习笔记】8:网页解析器及安装Beautiful Soup 4

网页解析器:从网页中提取出有价值数据的工具。因为将互联网上的网页获取到本地以后,需要对它们进行解析,才能提取出需要的内容。 对于搜索引擎来说,它会提取出网页中所有的URL,用于后续的访问。但是对于定向...

python学习笔记8--format

format()是python的内置函数,主要用来控制输出的格式,

《Python基础教程》学习笔记之[D8]更加抽象——类

只做涂鸦笔记之用,如有疑议等问题可留言探讨。 #!/usr/bin/env python2.7 # -*- coding: utf-8 -*- # 面向对象 对象 object # 多态 封...

Python学习笔记之8皇后算法

主要是为了实践一下Python 的一些语法及Class,因此,将原来的tcl8皇后程序,用python改写一下。 改写的时候,有几个地方的确遇到了一些小麻烦,也算增加一些经验 1. python的...

Principle of Computing (Python)学习笔记(8) Fifteenth Puzzle

这期project相对较复杂。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)