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

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

多态
面向对象程序设计最有趣的特性是多太,它是是让大多数人犯晕的特性。所以,先来介绍这个。
多态意思是“有多种形式”。多态意味着就算不知道变量所引用的对象类是什么,还是能对它进行操作,而它也会根据对象(或类)类型的不同而表现出不同的行为。

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

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

复制代码

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

  1. >>> def add(x,y):
  2. return x+y
  3. >>> add(1,2)
  4. >>> add('hello.','world')
  5. 'hello.world'

复制代码

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

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

  1. >>> def length_message(x):
  2. print"The length of " , repr(x),"is",len(x)
  3. >>> length_message('chongshi')
  4. The length of  'chongshi' is 8
  5. >>> length_message([1,2,3])
  6. The length of  [1, 2, 3] is 3

复制代码

len函数用于计算长度,repr用于放置函数的内容;repr函数是多态特性的代表之一---可以对任何东西使用。
很多函数和运算符都是多态的,你写的绝大多数程序可能都是,即便你并非有意这样。

封装

封装是对全局作用域中其它区域隐藏多余信息的原则。
封装听起来有些像多态,因为他们都是 抽象的原则---他们都会帮助处理程序组件而不用过多关心多余细节,就像函数做的一样。
但是封装并不等同于多态。多态的可以让用户对于不知道是什么类(或对象类型)的对象进行方法调用,而封装是可以不用关心对象是如何构建的而直接进行使用。
创建一个有对象(通过像调用函数一样调用类)后,将变量c绑定到该对象上。可以使用setName 和 getName 方法(假设已经有)

  1. >>> c = closedObject()
  2. >>> c.setName('sir lancelot')
  3. >>> c.getName()
  4. ‘sir lancelot’

复制代码

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

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

创建自己的类

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

  1. _metaclass_ = type #确定新式类
  2. class Person:
  3. def setName(self,name):
  4. self.name = name
  5. def getName(self):
  6. return self,name
  7. def greet(self):
  8. print "Hello, world! I'm %s" %self.name

复制代码

注意:新式类的语法中,需要在模块或者脚本开始的地方放置赋值语句_metaclass_ = type 。

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

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

复制代码

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

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

  1. >>> huhu.name
  2. 'hu zhiheng'
  3. >>> huhu.name = 'yoda'
  4. >>> huhu.greet()
  5. Hello, world! I'm yoda

复制代码

特性、函数和方法

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

  1. >>> class Class:
  2. def method(self):
  3. print 'I have a self!'
  4. >>> def function():
  5. print "I don't"
  6. >>> instance = Class()
  7. >>> instance.method()
  8. I have a self!
  9. >>> instance.method = function
  10. >>> instance.method()
  11. I don't

复制代码

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

  1. >>> class Bird:
  2. song =  'Squaawk!'
  3. def sing(self):
  4. print self.song
  5. >>> bird = Bird()
  6. >>> bird.sing()
  7. Squaawk!
  8. >>> birdsong = bird.sing
  9. >>> birdsong()
  10. Squaawk!

复制代码

指定超类

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

  1. class Filter:
  2. def init(self):
  3. self.blocked = []
  4. def filter(self , sequence):
  5. return [x for x in sequence if x not in self.blocked]
  6. class SPAMFilter(Filter):  #SPAMFilter是Filter的子类
  7. def init(self):        #重写Filter类中的init方法
  8. self.blocked = ['SPAM']

复制代码

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

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

复制代码

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

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

复制代码

调查继承

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

  1. >>> issubclass(SPAMFilter, Filter)
  2. True
  3. >>> issubclass(Filter,SPAMFilter)
  4. False

python的面向对象的特性(继承、封装、多态)的更多相关文章

  1. OOP面向对象 三大特征 继承封装多态

    OOP面向对象 ----三大特征 继承封装多态 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构 ...

  2. Python入门-面向对象三大特性-继承

    面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容. 例如: 猫可以:喵喵叫.吃.喝.拉.撒 狗可以:汪汪叫.吃.喝.拉.撒 如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实 ...

  3. python之面向对象三大特性: 继承(单继承)

    什么是继承 专业角度: B 继承 A类, B就叫做A的子类,派生类, A叫做B的父类,基类,超类. B类以及B类的对象使用A类的所有的属性以及方法. 字面意思: 继承就是继承父母所有的资产 class ...

  4. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  5. 黑马程序猿——JAVA面向对象的特性:封装,继承,多态

                                           - ----------android培训.java培训.java学习型技术博客.期待与您交流!------------  ...

  6. Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。

    Python3 与 C# 面向对象之-继承与多态   文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...

  7. Java基础-面向对象第一特性之封装(Encapsulation)

    Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...

  8. [.net 面向对象编程基础] (12) 面向对象三大特性——继承

    [.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...

  9. C#基础总结之八面向对象知识点总结-继承与多态-接口

    .方法深入讲解(返回值,形参与实参) 方法 public int getName(int i,int j) { int sum = i + j; return sum; } .利用泛型存储对象数据 . ...

  10. JAVA基础——面向对象三大特性:封装、继承、多态

    JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...

随机推荐

  1. python 趣味强制请吃饭

    # -*- coding: utf-8 -*- import easygui who = easygui.buttonbox("你想请谁吃饭 ?", "luckly qu ...

  2. sql 语言练习题

    1. 查询Student表中的所有记录的Sname.Ssex和Class列. 2. 查询教师所有的单位即不重复的Depart列. 3. 查询Student表的所有记录 . 4. 查询Score表中成绩 ...

  3. javascript javascript加载类似星座、血型的函数

     javascript加载类似星座.血型的函数 //加载血型 function bloodtypelaod(constellation) { var obj = document.getElement ...

  4. Hibernate常见异常总结

    系统配置 1.没有查找到src目录下的hibernate.cfg.xml Exception in thread "main" org.hibernate.HibernateExc ...

  5. 计算机上配置 IP地址,子网掩码,默认网关

    The Internet Assigned Numbers Authority (IANA) has reserved the following three blocks of the IP add ...

  6. hyperledger fabric 中java chaincode 支持离线打包

    联盟链由于其本身的特性,目前应用在一些大型国有企业银行比较多.出于安全考虑,这些企业一般会隔离外网环境.所以在实际生产需求中可能存在需要在一个离线的环境中打包安装chaincode的情况. 本文基于这 ...

  7. Java foreach remove问题分析

    原文链接:http://www.cnblogs.com/chrischennx/p/9610853.html 都说ArrayList在用foreach循环的时候,不能add元素,也不能remove元素 ...

  8. jdk 1.6.0_41 下载

    Java SE Development Kit 6u41 Product / File Description File Size Download password Linux x86 65.43 ...

  9. Color Length UVA - 1625

    题目大意: 给你两个字符串p,q,字符串中每个字符代表一个颜色,现在按顺序合并两个字符串,得到一个新字符串.新字符串的价值为,每个颜色价值的和,单个颜色价值的和等于该颜色在新字符中最后一次出现的位置减 ...

  10. java.lang.Exception: No tests found matching(Junit测试异常)

    java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=save], {ExactMatcher:fDispl ...