一 继承
 
基类定义例如以下:

class people:

    #define attribute

    name = ''

    age  = 0

    #define private attribute

    __weight = 0



    def __init__(self,n="hello",a=24,w=45.9):

        self.name = n

        self.age  = a

        self.__weight = w


    def __del__(self):

        print("people deconstructor........")


    def __repr__(self):

        print("people class")


    def speak(self):

        print("%s is speaking: I am %d years old" % (self.name,self.age))


    def weight(self):

        print("Weight number:%d" % (self.__weight))



单重继承
class student(people):

    grade = ''

    def __init__(self,n,a,w,g):

        people.__init__(self,n,a,w)

        self.grade = g





    def speak(self):

        print("%s is speaking: I am %d years old,and I am in grade %d" % (self.name,self.age,self.grade))



    def __del__(self):

        print("student deconstructor......")

 s  = student('ken',20,60,3)

 s.speak()



多重继承
class speaker():

    topic = ''

    name  = ''

    def __init__(self,n,t):

        self.name = n

        self.topic = t

    def speak(self):

        print("I am %s,I am a speaker!My topic is %s " % (self.name,self.topic))

    def __del__(self):

        print("speaker deconstructor.....")



class sample(speaker,student):

    a = ''

    def __init__(self,n,a,w,g,t):

        student.__init__(self,n,a,w,g)

        speaker.__init__(self,n,t)



    def __del__(self):

        print ('sample deconstructor')

       #  speaker.__del__()

       #  student.__del__()


test = sample("Tim",25,80,4,"Python")

test.speak()

须要注意圆括号里父类的顺序,若是父类中有同样的方法名,而在子类使用时未指定,python从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包括方法。


注意:
1. 在Python中,假设父类和子类都又一次定义了构造方法__init( )__,在进行子类实例化的时候,子类的构造方法不会自己主动调用父类的构造方法,必须在子类中显示调用。

2. 假设须要在子类中调用父类的方法,须要以 父类名.方法 这样的方式调用,以这样的方式调用的时候,注意要传递self參数过去。

  对于继承关系,子类继承了父类全部的公有属性和方法,能够在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来訪问的。

  Python支持多重继承。对于多重继承,比方

  class SubClass(SuperClass1,SuperClass2)

  此时有一个问题就是假设SubClass没有又一次定义构造方法,它会自己主动调用哪个父类的构造方法?这里记住一点:以第一个父类为中心。假设SubClass又一次定义了构造方法,须要显示去调用父类的构造方法,此时调用哪个父类的构造方法由你自己决定;若SubClass没有又一次定义构造方法,则仅仅会运行第一个父类的构造方法。而且若SuperClass1和SuperClass2中有同名的方法,通过子类的实例化对象去调用该方法时调用的是第一个父类中的方法。



二 多态

         多态即多种形态,在执行时确定其状态,在编译阶段无法确定其类型,这就是多态。Python中的多态和Java以及C++中的多态有点不同,Python中的变量在定义时不用指明其类型,它会依据须要在执行时确定变量的类型(个人认为这也是多态的一种体现),而且Python本身是一种解释性语言,不进行预编译,因此它就仅仅在执行时确定其状态,故也有人说Python是一种多态语言。

        在Python中非常多地方都能够体现多态的特性,比方内置函数len(object),len函数不仅能够计算字符串的长度,还能够计算列表、元组等对象中的数据个数,这里在执行时通过參数类型确定其详细的计算过程,正是多态的一种体现。这有点类似于函数重载(一个编译单元中有多个同名函数,但參数不同),相当于为每种类型都定义了一个len函数。这是典型的多态表现。有些朋友提出Python不支持多态,我是全然不赞同的。

  本质上,多态意味着能够对不同的对象使用相同的操作,但它们可能会以多种形态呈现出结果。len(object)函数就体现了这一点。在C++、Java、C#这样的编译型语言中,因为有编译过程,因此就鲜明地分成了执行时多态和编译时多态。执行时多态是指同意父类指针或名称来引用子类对象,或对象方法,而实际调用的方法为对象的类类型方法,这就是所谓的动态绑定。编译时多态有模板或范型、方法重载(overload)、方法重写(override)等。而Python是动态语言,动态地确定类型信息恰恰体现了多态的特征。在Python中,不论什么不知道对象究竟是什么类型,但又须要对象做点什么的时候,都会用到多态。

  可以直接说明多态的两段演示样例代码例如以下:

  1、方法多态

[python] view
plain
copy
  1. # -*- coding: UTF-8 -*-
  2. _metaclass_=type # 确定使用新式类
  3. class calculator:
  4. def count(self,args):
  5. return 1
  6. calc=calculator() #自己定义类型
  7. from random import choice
  8. obj=choice(['hello,world',[1,2,3],calc]) #obj是随机返回的 类型不确定
  9. print type(obj)
  10. print obj.count('a') #方法多态

  对于一个暂时对象obj,它通过Python的随机函数取出来,不知道详细类型(是字符串、元组还是自己定义类型),都能够调用count方法进行计算,至于count由谁(哪种类型)去做怎么去实现我们并不关心。

  有一种称为”鸭子类型(duck
typing)
“的东西,讲的也是多态:

[python] view
plain
copy
  1. _metaclass_=type # 确定使用新式类
  2. class Duck:
  3. def quack(self):
  4. print "Quaaaaaack!"
  5. def feathers(self):
  6. print "The duck has white and gray feathers."
  7. class Person:
  8. def quack(self):
  9. print "The person imitates a duck."
  10. def feathers(self):
  11. print "The person takes a feather from the ground and shows it."
  12. def in_the_forest(duck):
  13. duck.quack()
  14. duck.feathers()
  15. def game():
  16. donald = Duck()
  17. john = Person()
  18. in_the_forest(donald)
  19. in_the_forest(john)
  20. game()

  就in_the_forest函数而言,參数对象是一个鸭子类型,它实现了方法多态。可是实际上我们知道,从严格的抽象来讲,Person类型和Duck全然风马牛不相及。

  2、运算符多态

[python] view
plain
copy
  1. def add(x,y):
  2. return x+y
  3. print add(1,2) #输出3
  4. print add("hello,","world") #输出hello,world
  5. print add(1,"abc") #抛出异常 TypeError: unsupported operand type(s) for +: 'int' and 'str'

  上例中,显而易见,Python的加法运算符是”多态“的,理论上,我们实现的add方法支持随意支持加法的对象,可是我们不用关心两个參数x和y详细是什么类型。

   Python相同支持运算符重载,实比例如以下:

[python] view
plain
copy
  1. class Vector:
  2. def __init__(self, a, b):
  3. self.a = a
  4. self.b = b
  5. def __str__(self):
  6. return 'Vector (%d, %d)' % (self.a, self.b)
  7. def __add__(self,other):
  8. return Vector(self.a + other.a, self.b + other.b)
  9. v1 = Vector(2,10)
  10. v2 = Vector(5,-2)
  11. print v1 + v2

  一两个演示样例代码当然不能从根本上说明多态。普遍觉得面向对象最有价值最被低估的特征事实上是多态。我们所理解的多态的实现和子类的虚函数地址绑定有关系,多态的效果事实上和函数地址执行时动态绑定有关。在C++,
Java, C#中实现多态的方式通常有重写和重载两种,从上面两段代码,我们事实上能够分析得出Python中实现多态也能够变相理解为重写和重载。在Python中非常多内置函数和运算符都是多态的。

Python-面向对象 (二 继承)的更多相关文章

  1. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  2. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

  3. Python面向对象03 /继承

    Python面向对象03 /继承 目录 Python面向对象03 /继承 1. 初识继承 2. 单继承 3. 多继承 4. 总结 1. 初识继承 概念:专业角度:如果B类继承A类,B类就称为子类,派生 ...

  4. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  5. python面向对象编程 继承 组合 接口和抽象类

    1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...

  6. python面向对象的继承-组合-02

    *面向对象(OOP)的三大特征:**# 封装.继承.多态 继承 什么是继承 继承:# 是一种关系,描述两个对象之间什么是什么的什么的关系 例如:麦兜.佩奇.猪猪侠.猪刚鬣,都是猪 为什么要使用继承 继 ...

  7. python 面向对象之继承与派生

    一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...

  8. python面向对象之继承与派生

    一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...

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

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

  10. python面向对象之继承/多态/封装

    老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...

随机推荐

  1. Informatica9.6.1在Linux Red Hat 5.8上安装遇到的有关问题整理_4

    4.创建Integration Service后无法启动 1)错误日志: 2)解决办法: 进入Repository Service的属性页面,将其运行模式改成Normal.

  2. SNIFFER问题集锦

    SNIFFER相关教程下载: Sniffer使用教程.pdf|Sniffer用法.ppt 具体问题解决: 1.SNIFFER4.75无法使用,打开后提示 No adapter is binding t ...

  3. 写在阿里去IOE一周年

    [文/ 任英杰] 去年5月17日,阿里巴巴支付宝最后一台IBM小型机在下线,标志着阿里完成去IOE.随后一场去IOE运动不断发酵,甚至传闻IBM中国去年损失了20%的合同额. 去了IOE,奔向何方?阿 ...

  4. uoj #58. 【WC2013】糖果公园(树上莫队算法+修改操作)

    [题目链接] http://uoj.ac/problem/58 [题意] 有一棵树,结点有自己的颜色,若干询问:u,v路径上的获益,并提供修改颜色的操作. 其中获益定义为Vc*W1+Vc*W2+…+V ...

  5. 黑马程序员——有关protocol的小结

    在OC程序中经常会有这样的问题就是一个类想让其他类帮自己实现某些方法,然后再将结果返回给这个类:如何让一个类要找的代理去实现自己想要的方法呢? 这样就需要有一个协议,让能遵守协议的其他类都能实现协议中 ...

  6. echart图表控件配置入门(一)

    现在主流的web图表控件主要有hightchart.fusionchart.echart: echart作为百度前端部门近期推出的一个基于html5的免费图表控件,以其丰富图表类型和良好的兼容性速度得 ...

  7. Java 操作MySql数据库

    Java 项目开发中数据库操作是很重要的一个方面,对于初学者来说,MySql是比较容易熟悉的一种常见数据库,这篇文章记录了如何用Java来操作MySql数据库. 第一章 JDBC的概念 JDBC(Ja ...

  8. Linux下IP的配置

    修改ip地址1.即时生效:# ifconfig eth0 192.168.1.102 netmask 255.255.255.02.启动生效:修改/etc/sysconfig/network-scri ...

  9. hdu4135-Co-prime & Codeforces 547C Mike and Foam (容斥原理)

    hdu4135 求[L,R]范围内与N互质的数的个数. 分别求[1,L]和[1,R]和n互质的个数,求差. 利用容斥原理求解. 二进制枚举每一种质数的组合,奇加偶减. #include <bit ...

  10. 第三百二十六天 how can I 坚持

    今天元宵节啊,晚上去蓝色港湾看了看灯光节,快冻死了,人倒是挺多. 其他没啥了. 还有晚上吃了几个元宵. 好像冻感冒了,有点头晕. 睡觉.