Python系列之 - 面向对象(2)
类的三大特性
类的三大特性包括:
封装、继承、多态
一 封装
封装就是将类所用到的所有字段、属性、方法都包含在类代码段里面,当实例调用直接调用类中的方法即可。
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()
结果:
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")
结果:
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()
结果:
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 #def show(self):
# print("show in Son_1") 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()
结果:
show in Father
新式类: class Father(object):
def show(self):
print("show in Father") class Son_1(Father):
def __init__(self):
pass #def show(self):
# print("show in Son_1") 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()
结果:
show in Son_2
以上是在python2中的执行结果范例
深度优先: 先去Son_1中找,如果找不到就去Son_1的父类Father中找,如果找到就执行,找不到就到Son_2中找
广度优先:先去Son_1中找,如果找不到就去兄弟节点Son_2中找,都没有就去父类Father中找。
多态
什么是多态,简而言之就是对于同一个方法或函数,根据不同的输入能获取不同的结果的表现形式,多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为”一个接口,多个功能”。
我们通过以下两个例子来理解以下多态(以下代码为C#中的代码)
1 函数的重载方式多态
using System;
namespace PolymorphismApplication
{
class Printdata
{
void print(int i)
{
Console.WriteLine("Printing int: {0}", i );
} void print(double f)
{
Console.WriteLine("Printing float: {0}" , f);
} void print(string s)
{
Console.WriteLine("Printing string: {0}", s);
}
static void Main(string[] args)
{
Printdata p = new Printdata();
// 调用 print 来打印整数
p.print(5);
// 调用 print 来打印浮点数
p.print(500.263);
// 调用 print 来打印字符串
p.print("Hello C++");
Console.ReadKey();
}
}
}
我们通过以上看到,同一个函数名print(),由于传入的值不一样,得到的结果也不一样(这不是关键), 关键在于在一个模块中可以对用同一个函数名来定义多种方式,也就是一个接口的多种表现形式。
2 再来看一个关于类的例子:
在Caller模块中,对CallArea()方法传递的对象不同,获取的值也不一样,而且对传入的值类型必须是Shape 的类对象。传入别的值就会报错。
从以上2个例子可以看到,C#是属于强类型语言,所有函数或类方法中定义时就必须指定数据类型,这样表现出来的就是一个函数(接口)可以有不同的功能。这就属于多态。
而python是一门弱类型语言,对于所有函数或类方法只有在调用时才知道数据的类型。它是不支持多态的,也不需要使用多态。如果要实现多态的效果,可以参考一下方class F1 pass
class S1(F1):
def show(self):
print 'S1.show'
class S2(F1):
def show(self):
print 'S2.show'
using System;
namespace PolymorphismApplication
{
# 父类shape
class Shape
{
protected int width, height;
public Shape( int a=0, int b=0)
{
width = a;
height = b;
}
public virtual int area()
{
Console.WriteLine("父类的面积:");
return 0;
}
} # 子类Rectangle
class Rectangle: Shape
{
public Rectangle( int a=0, int b=0): base(a, b)
{ }
public override int area ()
{
Console.WriteLine("Rectangle 类的面积:");
return (width * height);
}
}
# 子类 Triangle
class Triangle: Shape
{
public Triangle(int a = 0, int b = 0): base(a, b)
{ }
public override int area()
{
Console.WriteLine("Triangle 类的面积:");
return (width * height / 2);
}
} # 另一个类
class Caller
{
# 定义一个方法,传入的值为一个Shape类的对象
public void CallArea(Shape sh)
{
int a;
a = sh.area();
Console.WriteLine("面积: {0}", a);
}
} class Tester
{ static void Main(string[] args)
{
# 实例化一个对象
Caller c = new Caller();
# 实例化一个Rectangle对象
Rectangle r = new Rectangle(10, 7);
# 实例化一个Triangle对象
Triangle t = new Triangle(10, 5);
# 调用c对象的CallArea方法,传入Rectangle
c.CallArea(r);
c.CallArea(t);
Console.ReadKey();
}
}
}
执行结果:
Rectangle 类的面积:
面积:70
Triangle 类的面积:
面积:25
#由于在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系列之 - 面向对象(2)的更多相关文章
- Python系列之 - 面向对象(1)
python是一门面向对象的编程语言,python中的一切均是对象. 有对象就提到类,对象和类就像是儿子和老子的关系,是不可分的一对. 什么是类 类就是具有一些共同特性的事物的统称.好比人类, ...
- python系列十六:Python3 面向对象
#!/usr/bin/python #-*-coding:gbk-*- #Python3 面向对象 '''面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了 ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 懂一点Python系列——快速入门
本文面相有 一定编程基础 的朋友学习,所以略过了 环境安装.IDE 搭建 等一系列简单繁琐的事情. 一.Python 简介 Python 英文原意为 "蟒蛇",直到 1989 年荷 ...
- python 高级之面向对象初级
python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 面向对象:对函数进行分类和封装,让开 ...
- python高级之面向对象高级
python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(pu ...
- 总结整理 -- python系列
python系列 python--基础学习(一)开发环境搭建,体验HelloWorld python--基础学习(二)判断 .循环.定义函数.继承.调用 python--基础学习(三)字符串单引号.双 ...
- [python 译] 基于面向对象的分析和设计
[python 译] 基于面向对象的分析和设计 // */ // ]]> [python 译] 基于面向对象的分析和设计 Table of Contents 1 原文地址 2 引言 2.1 ...
随机推荐
- 一个非常标准的连接Mysql数据库的示例代码
一.About Mysql 1.Mysql 优点 体积小.速度快.开放源码.免费 一般中小型网站的开发都选择 MySQL ,最流行的关系型数据库 LAMP / LNMP Linux作为操作系统 Apa ...
- web面试题
1.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? Ie(Ie内核) 火狐(Gecko) 谷歌(webkit) opear(Presto)
- 冲刺NO.12
Alpha冲刺第十二天 站立式会议 项目进展 项目核心功能,如学生基本信息管理模块,学生信用信息模块,奖惩事务管理模块等等都已完成,测试工作大体结束. 问题困难 项目结束后对项目的阶段性总结缺乏一定的 ...
- tornado 采用 epoll 代理构建高并发网络模型
1 阻塞和非阻塞 对于阻塞和非阻塞,网上有一个很形象的比喻,就是说好比你在等快递,阻塞模式就是快递如果不到,你就不能做其他事情.非阻塞模式就是在这段时间里面,你可以做其他事情,比如上网.打游戏.睡觉 ...
- 【iOS】swift-如何理解 if let 与guard?
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:黄兢成 链接:http://www.zhihu.com/question/36448325/answer/68614858 ...
- 关于tomcat部署应用的三种方式
关于tomcat部署应用虽然不是一个经常的操作,因为一旦选择了一种部署方式,我们其他的应用就会不经大脑的使用这种既定模式, 如果不使用这种部署方式,但是对于其他的部署方式不是很清楚的话,很容易抓瞎,所 ...
- MobileNet_v2
研究动机: 神经网络彻底改变了机器智能的许多领域,实现了超人的准确性.然而,提高准确性的驱动力往往需要付出代价:现代先进网络需要高度计算资源,超出许多移动和嵌入式应用的能力. 主要贡献: 发明了一个新 ...
- ResNet
 上图为单个模型 VGGNet, GoogleNet 都说明了深度对于神经网络的重要性. 文中在开始提出: 堆叠越多的层, 网络真的能学习的越好吗? 然后通过神经网络到达足够深度后出现的退化(deg ...
- python解释NTFS runlist的代码(文章转自北亚数据恢复张宇工程师)
代码如下: 执行效果如下:root@zhangyu-VirtualBox:~/NTFS-5# python3 read_runlist.py mft_source.img ***参数数量或格式错误! ...
- WebApi一个控制器中定义多个Get方法。
问题:怎样解决一个ApiController中定义多个Get方法或者Post方法? 答:要想实现一个ApiController中定义多个Get方法或者Post方法,则需要在WebApiConfig类中 ...