类的三大特性
类的三大特性包括:
封装、继承、多态

一、封装

封装就是将类所用到的所有字段、属性、方法都包含在类代码段里面,当实例调用直接调用类中的方法即可。

class People(object):

    def __init__(self,name):
self.name = name def talk(self):
print('my name is {0}'.format(self.name))

将函数talk() 封装到了类People下面,当实例化调用此函数时,只需要实例名+方法名即可调用

zhangsan = People('zhangsan')
zhangsan.talk(

out:

my name is zhangsan

对于类中的一些方法,如果我们在初始化(构造函数)中需要调用时,可以写成私有方法。这样在实例化对象后就直接执行。

class People(object):
color = 'red' def __init__(self,name):
self.name = name
self.__talk() def __talk(self):
print('my name is {0},color is {1}'.format(self.name,self.color)) zhangsan = People('zhangsan')

out:

my name is zhangsan,color is red

不用再调用talk()方法了

二、继承

继承是子类可以拥有父类的方法及属性、字段(对象字段), 但不可以继承类的私有方法(__开头的方法).
对于父类中有的方法,子类可以直接使用也可以重写。

class People(object):
color = 'red' def __init__(self, name):
self.name = name
self.__talk() def __talk(self):
print("my name is {0}, color is {1}".format(self.name, self.color))
def show_job(self):
print(" No job") class Teacher(People):
def __init__(self, name, age):
super(Teacher, self).__init__(name)
self.age = age
self.__talk() def __talk(self):
print("I'm Tearcher, I'm {0}".format(self.age))
def show_job(self):
print(" Teacher") zhangsan = Teacher("zhangsan",20)
zhangsan.show_job()

out:

my name is zhangsan, color is red
I'm Tearcher,  I'm 20
 Teacher

如上,虽然People与Teacher均有__talk方法,但该方法为私有方法,子类Teacher是无法继承的,而且show_job方法 虽然父类People中也有,但子类进行了重写。这样实例化调用时,仍然调动子类方法。

继承顺序:

经典类: 深度优先
新式类: 广度优先
在python2.x中对于多继承存在一个bug,对于新式类和经典类的多继承有以上区分,在python3.x中已经修复了,均为广度优先。

经典类:

class Father():
def show(self):
print("show in Father") class Son_1(Father):
def __init__(self):
pass class Son_2(Father):
def show(self):
print("show in Son_2") class subSon(Son_1,Son_2):
def __init__(self):
pass p = subSon()
p.show()

out:

show in Son_2

新式类:

class Father(object):
def show(self):
print("show in Father") class Son_1(Father):
def __init__(self):
pass class Son_2(Father):
def show(self):
print("show in Son_2") class subSon(Son_1,Son_2):
def __init__(self):
pass p = subSon()
p.show()

out:

show in Son_2

以上结果是在python3中执行的结果

python3 中 经典类和新式类 都是以广度优先

广度优先:先去Son_1中找,如果找不到就去兄弟节点Son_2中找,都没有就去父类Father中找。

如果子类的两个父类没有共同的父类的话,是一条道走到黑,即深度优先
如果子类的两个父类有共同的父类的话,是Son_1   然后是Son_2-->Father  ,即 广度优先

更多继承的详细讲解,请参考我的另外一篇博客  http://www.cnblogs.com/pangguoping/p/5699630.html

三、多态

什么是多态,简而言之就是对于同一个方法或函数,根据不同的输入能获取不同的结果的表现形式,多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为”一个接口,多个功能”。

python是一门弱类型语言,对于所有函数或类方法只有在调用时才知道数据的类型。它是不支持多态的,也不需要使用多态。

Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚“鸭子类型”。

class F1:
pass class S1(F1): def show(self):
print 'S1.show' class S2(F1): def show(self):
print 'S2.show' # 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象 def Func(F1 obj):
"""Func函数需要接收一个F1类型或者F1子类的类型""" print obj.show() s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show s2_obj = S2()
Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show

Python伪代码实现Java或C#的多态

class F1:
pass class S1(F1): def show(self):
print 'S1.show' class S2(F1): def show(self):
print 'S2.show' def Func(obj):
print obj.show() s1_obj = S1()
Func(s1_obj) s2_obj = S2()
Func(s2_obj)

Python “鸭子类型”

参考:

http://blog.csdn.net/songfreeman/article/details/50815701

http://www.cnblogs.com/wupeiqi/p/4493506.html

python - 面向对象(二)的更多相关文章

  1. python面向对象(二)——类成员

    Python面向对象    类成员 1.字段         普通字段    属于对象         静态字段    属于类   2.方法 普通方法   触发者是对象    括号里至少一个参数 se ...

  2. python面向对象二

    1.1类的静态属性,类方法,类的静态方法 1.1.1静态属性(@property) 在类中: python内置的@property装饰器就是负责把一个方法(函数)变成属性来调用. class Stud ...

  3. python 面向对象二 类和实例

    一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...

  4. Python 面向对象(二) 特殊方法

    一些Python特殊方法的汇总 __bases__    类的基类,返回元祖__base__  类的基类,也叫父类__call__ '类名()',类名加括号调用时执行的语句__class__ 对象或类 ...

  5. python面向对象(二)

    属性查找 类有两种属性:数据属性和函数属性 1. 类的数据属性是所有对象共享的 2. 类的函数属性是绑定给对象用的 class BeijingStudent:   school='Beijing'  ...

  6. python 面向对象(二)--访问限制

    在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...

  7. python 面向对象(二)成员

    ##################################总结########################### 类的成员: 变量: 实例变量      对象.属性=xxx 类变量    ...

  8. Python 面向对象二(转载)

    来源:www.cnblogs.com/wupeiqi/p/4766801.html 三.类成员的修饰符 类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式: 1.公有成员, ...

  9. 四十一、python面向对象二

    A.成员: 1.字段:静态字段(每个对象都有同一字段),普通字典(每个对象都有不同的数据) 2.方法:静态方法(无需使用对象的内容),类方法,普通方法(使用对象中的数据) 3.特性:普通特性(将方法伪 ...

  10. Python自动化开发 - 面向对象(二)

    本节内容 1.isinstance(obj,cls)和issubclass(sub,super) 2.反射 3.__setattr__,__delattr__,__getattr__ 一. isins ...

随机推荐

  1. python 元类与定制元类

    1:元类 元类:类的创建与管理者 所有类的元类是type class a: pass print(type(a)) 结果:<class 'type'> 2:定制元类 类的实例化过程:(可看 ...

  2. Sherpa | Complete Navigation System 介绍与教材

    这里的夏尔巴人在iPad上使用的一种新的视频. 正如其名称所暗示的,夏尔巴人是所有您的导航需求的整体解决方案. 夏尔巴人带来了每个接口的三个主要的导航元素结合在一起 - 导航栏,侧边栏和页脚粘. 每一 ...

  3. ORACLE之SQL语句内部解析过程【weber出品】

    一.客户端通过监听连接到数据库,数据库开启一个server process进程来接收客户端传过来的sql. 1.这条sql语句从来都没有被执行过.(硬解析) 2.这条sql语句被执行过.(软解析) 二 ...

  4. JSP Servlet SQL 三者之间数据传递

    前言: 最近一直在做WEB开发,现总结一下这一段时间的体会和感触. 切记,web开发重点在于前台数据交互,页面美化而不要太沉溺于底层数据. 浏览器时代来到,向我们召唤出更炫.更简洁.更方便.更大气的网 ...

  5. 第1章 网络编程基础(2)——Socket编程原理

    Socket编程原理 Socket是网络通信端点的一种抽象,它提供了一种发送和接收数据的机制. 流socket(SOCK_STREAM):双向.有序.无重复.并且无记录边界 数据报Socket(SOC ...

  6. uva 469 - Wetlands of Florida

    题目:给你一个矩阵和某些点,找到给的点所处连续的W区域的面积(八个方向). 分析:搜索.floodfill算法,利用搜索直接求解就可以了. 说明:注意读入数据的格式. #include <cst ...

  7. 实际工作中遇到的一些css

    1.除去table默认的每个单元格带有的类似内边距的空白如设置了table和td的border后,是这个样子:,设置<table cellspacing="0" >后变 ...

  8. ECSTORE 货币格式

    世界上许多国家都有不同的货币 格局和数字 格局 特例 .针对特定的当地化环境正确地 格局化和显示货币是当地化的一个主要部分,ecstore 可以同过后台的设置,来更改货币的格式,具体方式为 后台-&g ...

  9. Linux下查看Apache的请求数

    在Linux下查看Apache的负载情况,以前也说过,最简单有有效的方式就是查看Apache Server Status(如何开启Apache Server Status点这里),在没有开启Apach ...

  10. PHP正则表达式屏蔽电话号码中间段

    要屏蔽电话号码中间段,首先要知道电话号码的正则表达式. 先来看看PHP匹配电话号码的正则表达式. 匹配固定电话的正则表达式为: /(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\- ...