【python学习-5】面向对象的python
python是一种面向对象的编程语言,虽然与C++一样,支持面向过程的程序设计,python完全可以使用函数、模块等方式来完成工作,但是当使用python编写一个较大的项目时,则应该考虑使用面向对象的方法,以便于更好地对项目进行管理。
1、python的类特性:
① 类的抽象性:类是对具有共同方法和属性的一类对象的描述。
② 类的封装性:类将属性和方法封装,外部是不可见的,只有通过类提供的接口才能与属于类的的实例对象进行信息交换。
③ 类的继承性:类可以由已有的类派生,派生出来的类拥有父类方法和属性。
④ 类的多态性:类可以根据不同的参数类型调用不同的方法,同一个方法可以处理不同类型的参数。
在python中, 对象概念比较广泛,对象不一定就是类的实例。python的内置数据类型如字符串、列表、字典等,都不是类,但却具有一些和类相似的语法。
2、类的定义和使用:
类的定义如下:
- class <类名>:
- <语句1>
- <语句2>
- ...
- <语句n>
- class <类名>(父类名):
- <语句1>
- <语句2>
- ...
- <语句n>
上面两种定义方式,第一种是没有继承关系的,第二种是继承了父类的,在类名后面的圆括号里面加上父类的名字就行。
类内部与函数内部一样,相当于一个局部作用域,不同类的内部可以使用相同的属性名。
虽然类首先需要实例化,然后才能使用其属性。但实际上当创建一个类以后就可以通过类名访问其属性了。如果直接使用类名修改其属性,那么将影响已经通过该类实例化的其他对象。
- #!/usr/bin/python
- class animal:
- name = "animal";
- num = 1;
- class human(animal):
- name = "human";
- age = 99;
- h = human();
- # python 没有java的toString机制,所以不同类型的数据相加需要转化
- print( h.name + ',' + str(h.num) ); # human,1
- human.name = 'new human'; # 改变类的name属性
- print(h.name); # 实例h中并没有修改name的值,所以默认使用的是类的name值,值变了:new human
- h.name = 'human h'; # 实例h中修改了name的值
- print(h.name); # human h
- human.name = 'new human2';
- print(h.name); # 实例h中并修改了name的值,虽然类的name值变了,但h.name还是:human h
- h2 = human(); # 第二个实例
- print(h2.name); # 新建的对象,name属性是:new human2
3、类的私有属性和方法
类的外部可以设置其属性的值,在某些情况下,我们不希望在类外部对其进行操作,所以就有了私有属性。
python的私有属性不是通过关键字控制的,而是通过变量名控制的:变量名以双下划线开始的变量,是私有属性,如 __myAttr ; 如果在类内部方法中访问私有属性,应该加上self,如:self.__myAttr 。
定义类的方法,与函数定义十分相似,也是使用def 定义的,但是和函数有一点区别是,类的方法,入参的第一个需要是 self 。
类的私有方法与私有属性一样,只能在类内部使用,名称是以双下划线开头的,类内部调用私有方法,要使用 “ self.私有方法名 ” 的形式调用。
- #!/usr/bin/python
- class animal:
- name = "animal";
- num = 1;
- __nickName = "Some thing just like this"; # 类私有属性
- def __getNickName(self): # 类私有方法
- return self.__nickName;
- def showNickName(self): # 类对外提供的方法
- print("I have a NickName:" + self.__getNickName() );
- def showNickNameAbc(self,abc): # 类对外提供的方法
- self.showNickName();
- print("this is a secret:" + str(abc) );
- def addNum(self,*nums): # 类对外提供的方法,任意个数参数
- result = 0;
- for i in nums:
- result += i;
- return result;
- a = animal();
- # print(a.__nickName); # 报错:AttributeError: 'animal' object has no attribute '__nickName'
- # print(a.__getNickName()); # 报错:AttributeError: 'animal' object has no attribute '__getNickName'
- a.showNickName();
- print(a.addNum(1,2,3,4,5));
- a.showNickNameAbc('Mike');
4、类的专有方法
在python中,类中有一些以双下划线开始并且以双下划线结束的方法,我们称之为类的专有方法,比如 __init__ 方法是类实例化的时候调用的。
- __init__ 构造函数,生成对象时调用
- __del__ 析构函数,释放对象时调用
- __add__ 加运算
- __mul__ 乘运算
- __cmp__ 比较运算
- __repr__ 打印,转换
- __setitem__ 按照索引赋值
- __getitem__ 按照索引获取值
- __len__ 获取长度
- __call__ 函数调用
- #!/usr/bin/python
- class animal:
- name = "animal";
- num = 1;
- __nickName = "Some thing just like this"; # 类私有属性
- def __getNickName(self): # 类私有方法
- return self.__nickName;
- def showNickName(self): # 类对外提供的方法
- print("I have a NickName:" + self.__getNickName() );
- def __init__(self,nickName): # 类构造方法
- self.__nickName = nickName;
- a = animal('Mike');
- a.showNickName();
5、类的继承
前面已经提到类的继承了,新类可以继承父类的公用属性和共有方法,但是不能继承父类的私有属性和私有方法。
python的类继承是多继承,一个类可以继承多个类,格式如下:
- class 新类名(父类1,父类2,...,父类n):
- <语句1>
- <语句2>
- ...
- <语句n>
6、类中重载方法和运算符
继承父类之后,避免重命名函数,可以使用方法的重载来解决
- #!/usr/bin/python
- class animal:
- name = "animal";
- num = 1;
- def show(self): # 类对外提供的方法
- print(self.name);
- print(self.num);
- class human(animal):
- name = "human";
- age = 100;
- def show(self): # 重载方法
- animal.show(self);
- print(self.age);
- h = human();
- h.show();
运算符重载,对应的是类的专有方法:
- + __add__
- - __sub__
- * __mul__
- / __div__
- % __mod__
- ** __pow__
- #!/usr/bin/python
- class animal:
- name = "animal";
- num = 1;
- def show(self): # 类对外提供的方法
- print(self.name);
- print(self.num);
- def __add__(self,n):
- self.num += n;
- h = animal();
- h.show();
- h+5; # 调用 __add__ 方法
- h.show();
可以在模块中定义类,在访问的类时候,就使用 “ 模块名.类名 ” 对类进行调用。
【python学习-5】面向对象的python的更多相关文章
- Python学习之==>面向对象编程(二)
一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...
- python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍
目录 python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍.md 一丶字典 1.字典的定义 2.字典的使用. 3.字典的常用方法. python学习第八讲,python ...
- python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍
目录 python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍 一丶元祖 1.元祖简介 2.元祖变量的定义 3.元祖变量的常用操作. 4.元祖的遍历 5.元祖的应用场景 p ...
- python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍
目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...
- python学习第四讲,python基础语法之判断语句,循环语句
目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...
- Python学习一(面向对象和函数式编程)
学习了一周的Python,虽然一本书还没看完但是也收获颇多,作为一个老码农竟然想起了曾经荒废好久的园子,写点东西当做是学习笔记吧 对Python的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...
- python学习之面向对象
目录 __main__,__name__ __module__,__class__ __init__ __del__ __repr__,__str__ __mro__ __call__ __new__ ...
- python学习之路-1 python简介及安装方法
python简介 一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. 目前最新版本为3.5.1,发布于2015年12月07日 ...
- python学习笔记1之-python简介及其环境安装
python学习笔记之-python简介及其环境安装 最近几年python之火不用多说,最近开始利用时间自学python,在学习的过程中,按照自己的思路和理解记录下学习的过程,并分享出来,如果正好你也 ...
- Python学习【02】Python基础
一.Python内部执行过程 1.Python的后缀名可以是任意? print("hello,world") 保存成 .py / .txt / .sb / .aaa 都可以用在 ...
随机推荐
- 收藏:Windows消息机制
百度百科介绍的windows消息机制也不错:http://baike.baidu.com/view/672379.htm Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视 ...
- boost::unique_lock和boost::lock_guard的区别
lock_guard unique_lock boost::mutex mutex; boost::unique_lock<boost::mutex> lock(mutex); std:: ...
- MySQL的replace方法
mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便,mysql 替换函数replace()Update `table_name` ...
- win下jdk7环境变量的配置
win下jdk7环境变量的配置: 单击计算机(Computer),选择属性(Properties),选择高级系统设置(Advanced systems settings), 选择环境变量(Enviro ...
- python获取指定目录下所有文件名os.walk和os.listdir
python获取指定目录下所有文件名os.walk和os.listdir 觉得有用的话,欢迎一起讨论相互学习~Follow Me os.walk 返回指定路径下所有文件和子文件夹中所有文件列表 其中文 ...
- bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...
- bzoj千题计划210:bzoj2642 | Poj3968 | UVALive 4992| hdu 3761 Jungle Outpost
http://www.lydsy.com/JudgeOnline/problem.php?id=2642 题意: n个瞭望台,形成一个凸n边形.这些瞭望台的保护范围是这个凸包内的任意点. 敌人进攻时, ...
- Chrome插件笔记之content_scripts
一.概论 说这个之前先看一个段子,讲的是甲方有一奇葩客户,这客户看一网站某些样式很别扭不得劲,非要让乙方修改,乍一听没毛病,但关键是这网站不是乙方家的,根本没有修改权限,怎么办,客户就是上帝,上帝的要 ...
- Route Between Two Nodes in Graph
Given a directed graph, design an algorithm to find out whether there is a route between two nodes. ...
- 统一过程模型(RUP/UP)
http://blog.sina.com.cn/s/blog_6a06f1b7010121hz.html 统一过程(RUP/UP,Rational Unified Process)是一种以用例驱动.以 ...