Python的OO思想
想当年大二的时候,在学校学习Java,
最牛逼的OO思想,用了3页纸就讲完了,还是清华大学出版社的呢。
后来全凭自己啃视频,啃代码才搞懂什么叫做OO。
现在学习Python,就用自己的方式,好好学习一次:
OO的基本,是封装,继承,多态。
首先是继承:
定义一个类:
- class Bird(object):
- have_feather = True
- way_of_reproduction = 'egg'
调用这个类:
- summer = Bird()
- print summer.way_of_reproduction
与Java不同是,Python是不需要new来实例化类的。
同样,Python的类下面是可以定方法的:
- class Bird(object):
- have_feather = True
- way_of_reproduction = 'egg'
- def say(self, word='hi hi'):
- print 'i say :' + word
注意一点,所有类的函数,必须至少带有一个参数,这个参数必须是self。
类以外的函数没有这一个限制。
- chk = Chicken()
- print chk.have_feather
- print chk.sat('hello')
__init__()方法
__init__()是一个特殊方法(special method)。Python里会有一些特殊方法,Python会以特别的方式处理它们。特殊方法的名字的特点是前后都有两个下划线。
__init__()方法的特殊在于,如果你在类中定义了这个方法,一旦你根据这个类建立对象,Python就会自动调用这个方法(这个过程也叫初始化)。
如:
- class happyBird(Bird):
- def __init__(self,more_words):
- print 'We are happy birds.',more_words
- hb = happyBird('Happy,Happy!')
父类方法的重载:
- class Hello(object):
- name = 'hello'
- def __init__(self):
- self.name='my name is hello'
- #类中的参数必须带有self参数
- def sayhi(self):
- print 'hi you'
- class World(Hello):
- def __init__(self):
- #这里访问的是父类初始化的变量名
- print 'before:',Hello.name
- super(World,self).__init__()
- #由于调用了父类的初始化构造函数,继承了父类的变量的改变
- print 'after:',self.name
- #近似于方法重载
- def sayhi(self,word='baby'):
- #调用父类sayhi方法
- super(World,self).sayhi()
- print 'hi '+word
- def sayWorld(self):
- print 'hi,hello world'
- if __name__ == '__main__':
- c = World()
- c.sayhi()
- c.sayWorld()
另外,python是允许多继承的,但是这个是个非常危险的操作,建议不要随便使用。
关于Python的多态,就像JavaScript一样,直接访问对象的属性,不需要使用接口,没有类型转换。
对于类型的判断,有抓们的type()函数,和isinstance()函数判断是否某个函数的子类。
- isinstance(object, classinfo)
- 判断实例是否是这个类或者object是变量
- classinfo 是类型(tuple,dict,int,float)
- 判断变量是否是这个类型
- class objA:
- pass
- A = objA()
- B = 'a','v'
- C = 'a string'
- print isinstance(A, objA)
- print isinstance(B, tuple)
- print isinstance(C, basestring)
- 输出结果:
- True
- True
- True
Python的OO思想的更多相关文章
- c++学习笔记---01---C++语言与OO思想介绍
C++语言与OO思想介绍 C++的特点与OO思想 C语言有一个优点,即它的速度可以很快.写出来的程序可以很精练.简单.小巧,不用为了解决某个问题环绕太平洋一大圈. 但如果将C和C++相比较,C++就经 ...
- python 面向对象设计思想发展史
这篇主要说的是程序设计思想发展历史,分为概述和详细发展历史 一,概述 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的 指令和数 据.简单来 ...
- len(x) 击败 x.len(),从内置函数看 Python 的设计思想
内置函数是 Python 的一大特色,用极简的语法实现很多常用的操作. 它们预先定义在内置命名空间中,开箱即用,所见即所得.Python 被公认是一种新手友好型的语言,这种说法能够成立,内置函数在其中 ...
- Python算法——递归思想
编程语言在构建程序时的基本操作有:内置数据类型操作.选择.循环.函数调用等,递归实际属于函数调用的一种特殊情况(函数调用自身),其数学基础是数学归纳法.递归在计算机程序设计中非常重要,是许多高级算法实 ...
- OO思想举例,控制翻转,依赖注入
(转自kumaws,原帖地址:http://www.cnblogs.com/kumaws/archive/2009/04/06/from_interface_to_DependencyInjectio ...
- Python鸭子类型思想
动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it ...
- Python用积分思想计算圆周率
[文本出自天外归云的博客园] 早上起来突然想求圆周率,1单位时圆的面积. 代码如下: from math import pow, sqrt def calc_circle_s_with(r, dy, ...
- python之协程与IO操作
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
- Python的平凡之路(6)
一.面向对象编程介绍 1 编程范式: 编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式.随着编程方法学和软件工程研究的深入,特别是OO ...
随机推荐
- android 设置控件的颜色,字体
1.用代码设置控件的颜色: int b = getResources().getColor(R.drawable.blue);//得到配置文件里的颜色 mButton.setTextCo ...
- 索引 split2
当往一个已经满了的索引块中插入新的索引条目时,将发生索引块的split,在9i下,分两种不同的情况进行split: (1)如果插入的索引键值不是最大的,将发生50-50的split,也就是说有bloc ...
- Java 异常 —— Bad version number in .class file
把一个项目拷贝到另一个环境,运行时报错: Caused by: java.lang.UnsupportedClassVersionError: Bad version number in .class ...
- Django自定义模型(model)中的字段标签
方法一: 在编辑页面中,每个字段的标签都是从模块的字段名称生成的. 规则很简单: 用空格替换下划线:首字母大写.例如:Book模块中publication_date的标签是Publication da ...
- Android gingerbread eMMC booting
Android gingerbread eMMC booting This page is currently under construction. The content of this page ...
- 《OD大数据实战》MongoDB环境搭建
一.MongonDB环境搭建 1. 下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz 2. 解压 tar -zxvf ...
- UVa 12265 (单调栈) Selling Land
紫书上分析了很多很多,超详细,= ̄ω ̄= 每扫描一行可以计算一个height数组,表示从这块空地向上延伸多少块空地,而且这个数组可以逐行递推. 首先对于每一行来说维护一个单调栈,栈里放的是矩形的左上角 ...
- POJ 3308 Paratroopers (对数转换+最小点权覆盖)
题意 敌人侵略r*c的地图.为了消灭敌人,可以在某一行或者某一列安置超级大炮.每一个大炮可以瞬间消灭这一行(或者列)的敌人.安装消灭第i行的大炮消费是ri.安装消灭第j行的大炮消费是ci现在有n个敌人 ...
- /bin/bash: [xxxx]: command not found
/******************************************************************************** * /bin/bash: [xxxx ...
- RPi 2B Android telnet ssh
/*********************************************************************** * RPi 2B Android telnet ssh ...