Python-面向对象 (二 继承)
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))
单重继承
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.speak()
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()
2. 假设须要在子类中调用父类的方法,须要以 父类名.方法 这样的方式调用,以这样的方式调用的时候,注意要传递self參数过去。
对于继承关系,子类继承了父类全部的公有属性和方法,能够在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来訪问的。
Python支持多重继承。对于多重继承,比方
class SubClass(SuperClass1,SuperClass2)
此时有一个问题就是假设SubClass没有又一次定义构造方法,它会自己主动调用哪个父类的构造方法?这里记住一点:以第一个父类为中心。假设SubClass又一次定义了构造方法,须要显示去调用父类的构造方法,此时调用哪个父类的构造方法由你自己决定;若SubClass没有又一次定义构造方法,则仅仅会运行第一个父类的构造方法。而且若SuperClass1和SuperClass2中有同名的方法,通过子类的实例化对象去调用该方法时调用的是第一个父类中的方法。
本质上,多态意味着能够对不同的对象使用相同的操作,但它们可能会以多种形态呈现出结果。len(object)函数就体现了这一点。在C++、Java、C#这样的编译型语言中,因为有编译过程,因此就鲜明地分成了执行时多态和编译时多态。执行时多态是指同意父类指针或名称来引用子类对象,或对象方法,而实际调用的方法为对象的类类型方法,这就是所谓的动态绑定。编译时多态有模板或范型、方法重载(overload)、方法重写(override)等。而Python是动态语言,动态地确定类型信息恰恰体现了多态的特征。在Python中,不论什么不知道对象究竟是什么类型,但又须要对象做点什么的时候,都会用到多态。
可以直接说明多态的两段演示样例代码例如以下:
1、方法多态
- # -*- coding: UTF-8 -*-
- _metaclass_=type # 确定使用新式类
- class calculator:
- def count(self,args):
- return 1
- calc=calculator() #自己定义类型
- from random import choice
- obj=choice(['hello,world',[1,2,3],calc]) #obj是随机返回的 类型不确定
- print type(obj)
- print obj.count('a') #方法多态
对于一个暂时对象obj,它通过Python的随机函数取出来,不知道详细类型(是字符串、元组还是自己定义类型),都能够调用count方法进行计算,至于count由谁(哪种类型)去做怎么去实现我们并不关心。
有一种称为”鸭子类型(duck
typing)“的东西,讲的也是多态:
- _metaclass_=type # 确定使用新式类
- class Duck:
- def quack(self):
- print "Quaaaaaack!"
- def feathers(self):
- print "The duck has white and gray feathers."
- class Person:
- def quack(self):
- print "The person imitates a duck."
- def feathers(self):
- print "The person takes a feather from the ground and shows it."
- def in_the_forest(duck):
- duck.quack()
- duck.feathers()
- def game():
- donald = Duck()
- john = Person()
- in_the_forest(donald)
- in_the_forest(john)
- game()
就in_the_forest函数而言,參数对象是一个鸭子类型,它实现了方法多态。可是实际上我们知道,从严格的抽象来讲,Person类型和Duck全然风马牛不相及。
2、运算符多态
- def add(x,y):
- return x+y
- print add(1,2) #输出3
- print add("hello,","world") #输出hello,world
- print add(1,"abc") #抛出异常 TypeError: unsupported operand type(s) for +: 'int' and 'str'
上例中,显而易见,Python的加法运算符是”多态“的,理论上,我们实现的add方法支持随意支持加法的对象,可是我们不用关心两个參数x和y详细是什么类型。
Python相同支持运算符重载,实比例如以下:
- class Vector:
- def __init__(self, a, b):
- self.a = a
- self.b = b
- def __str__(self):
- return 'Vector (%d, %d)' % (self.a, self.b)
- def __add__(self,other):
- return Vector(self.a + other.a, self.b + other.b)
- v1 = Vector(2,10)
- v2 = Vector(5,-2)
- print v1 + v2
一两个演示样例代码当然不能从根本上说明多态。普遍觉得面向对象最有价值最被低估的特征事实上是多态。我们所理解的多态的实现和子类的虚函数地址绑定有关系,多态的效果事实上和函数地址执行时动态绑定有关。在C++,
Java, C#中实现多态的方式通常有重写和重载两种,从上面两段代码,我们事实上能够分析得出Python中实现多态也能够变相理解为重写和重载。在Python中非常多内置函数和运算符都是多态的。
Python-面向对象 (二 继承)的更多相关文章
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
- Python面向对象03 /继承
Python面向对象03 /继承 目录 Python面向对象03 /继承 1. 初识继承 2. 单继承 3. 多继承 4. 总结 1. 初识继承 概念:专业角度:如果B类继承A类,B类就称为子类,派生 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
- python面向对象的继承-组合-02
*面向对象(OOP)的三大特征:**# 封装.继承.多态 继承 什么是继承 继承:# 是一种关系,描述两个对象之间什么是什么的什么的关系 例如:麦兜.佩奇.猪猪侠.猪刚鬣,都是猪 为什么要使用继承 继 ...
- python 面向对象之继承与派生
一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...
- python面向对象之继承与派生
一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...
- python面向对象(二)——类成员
Python面向对象 类成员 1.字段 普通字段 属于对象 静态字段 属于类 2.方法 普通方法 触发者是对象 括号里至少一个参数 se ...
- python面向对象之继承/多态/封装
老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...
随机推荐
- Tomcat: localhost:8080 提示404
下午配置环境,配置完成后,欣喜地进入localhost:8080,结果给我提示404 心想:尼玛,这localhost都还会404,这不坑爹吗?! 琢磨了好久,结果被我搞定了,只需要做一个改动: 打开 ...
- android学习——MeasureSpec介绍及使用
一.MeasureSpc类说明 SDK的介绍:MeasureSpc类封装了父View传递给子View的布局(layout)要求.每个MeasureSpc实例代表宽度或者高度 它有三种模式:①.UNSP ...
- postgresql编译安装与调试(二)
接前文postgresql编译安装与调试(一),继续说说postgresql的编译安装与调试. 上一篇已经详细说明了如何在Linux系统上编译安装postgresql,这次我们在此基础上简单讲讲如何在 ...
- Solution multisite htaccess cleanURL
My solution to getting Clean URL working with my multisite setup drupal 4.7 I added Alias to my http ...
- Php 笔记1-----request和 response
不能大于2KB 第一次学习 php, 因为以前习惯了 .net, 所以 刚开始总是按照.net的 思路去思考, 怎么获取 客户端发过来的 request对象啊, 怎么设置response啊.. ...
- Linux服务部署
1. 构建NTP时间服务器 NTP服务器是用于局域网服务器时间同步使用的,可以保证局域网所有的服务器与时间服务器的时间保持一致,某些应用对时间实时性要求高的必须统一时间.互联网的时间服务器也有很多,例 ...
- Dzz任务板初版完成笔记-仿trello私有部署的一款轻量团队任务协作工具。
刚完成了第一个版本Dzz任务板的设计开发,记录下设计思路和完成情况. Dzz任务板是DzzOffice中的团队协作套件中的一款应用,它需要安装在DzzOffice中使用. 主界面中需要能够快速简单的创 ...
- 苹果将通过新Apple TV打造电视游戏平台 欲发力家庭游戏(转)
据<纽约时报>报道,9月10日凌晨1时举行的苹果发布会上将会公布新版Apple TV设备,还会推出TV版App Store.新设备以游戏作为主要卖点,图形性能将大幅提升. 苹果2015年秋 ...
- java 代码如何生成 chm
由于要把一个框架的东西打成 chm, 今天在网上找了几篇文章 http://blog.sina.com.cn/s/blog_5d31611a0100gqwp.html 李顺利 首先第一步,从eclip ...
- Oracle 学习用
最近在学习Oracle数据库 ,公司用这个,学习到现在,唉!苦逼的程序员呀! 也只能在这里发发牢骚了,这个是转载的 ,发完睡觉! oracle sql语句 一.ORACLE的启动和关闭 .在单机环境下 ...
