python是一种面向对象的编程语言,虽然与C++一样,支持面向过程的程序设计,python完全可以使用函数、模块等方式来完成工作,但是当使用python编写一个较大的项目时,则应该考虑使用面向对象的方法,以便于更好地对项目进行管理。

1、python的类特性:

  ① 类的抽象性:类是对具有共同方法和属性的一类对象的描述。

  ② 类的封装性:类将属性和方法封装,外部是不可见的,只有通过类提供的接口才能与属于类的的实例对象进行信息交换。

  ③ 类的继承性:类可以由已有的类派生,派生出来的类拥有父类方法和属性。

  ④ 类的多态性:类可以根据不同的参数类型调用不同的方法,同一个方法可以处理不同类型的参数。

  在python中, 对象概念比较广泛,对象不一定就是类的实例。python的内置数据类型如字符串、列表、字典等,都不是类,但却具有一些和类相似的语法。

2、类的定义和使用:

  类的定义如下:

  1. class <类名>:
  2. <语句1>
  3. <语句2>
  4. ...
  5. <语句n>
  6.  
  7. class <类名>(父类名):
  8. <语句1>
  9. <语句2>
  10. ...
  11. <语句n>

  上面两种定义方式,第一种是没有继承关系的,第二种是继承了父类的,在类名后面的圆括号里面加上父类的名字就行。

  类内部与函数内部一样,相当于一个局部作用域,不同类的内部可以使用相同的属性名。

  虽然类首先需要实例化,然后才能使用其属性。但实际上当创建一个类以后就可以通过类名访问其属性了。如果直接使用类名修改其属性,那么将影响已经通过该类实例化的其他对象。

  1. #!/usr/bin/python
  2. class animal:
  3. name = "animal";
  4. num = 1;
  5.  
  6. class human(animal):
  7. name = "human";
  8. age = 99;
  9.  
  10. h = human();
  11. # python 没有java的toString机制,所以不同类型的数据相加需要转化
  12. print( h.name + ',' + str(h.num) ); # human,1
  13. human.name = 'new human'; # 改变类的name属性
  14. print(h.name); # 实例h中并没有修改name的值,所以默认使用的是类的name值,值变了:new human
  15. h.name = 'human h'; # 实例h中修改了name的值
  16. print(h.name); # human h
  17. human.name = 'new human2';
  18. print(h.name); # 实例h中并修改了name的值,虽然类的name值变了,但h.name还是:human h
  19. h2 = human(); # 第二个实例
  20. print(h2.name); # 新建的对象,name属性是:new human2

3、类的私有属性和方法

  类的外部可以设置其属性的值,在某些情况下,我们不希望在类外部对其进行操作,所以就有了私有属性。

  python的私有属性不是通过关键字控制的,而是通过变量名控制的:变量名以双下划线开始的变量,是私有属性,如 __myAttr ; 如果在类内部方法中访问私有属性,应该加上self,如:self.__myAttr 。

  定义类的方法,与函数定义十分相似,也是使用def 定义的,但是和函数有一点区别是,类的方法,入参的第一个需要是 self 。

  类的私有方法与私有属性一样,只能在类内部使用,名称是以双下划线开头的,类内部调用私有方法,要使用 “ self.私有方法名 ” 的形式调用。

  1. #!/usr/bin/python
  2. class animal:
  3. name = "animal";
  4. num = 1;
  5. __nickName = "Some thing just like this"; # 类私有属性
  6. def __getNickName(self): # 类私有方法
  7. return self.__nickName;
  8. def showNickName(self): # 类对外提供的方法
  9. print("I have a NickName:" + self.__getNickName() );
  10. def showNickNameAbc(self,abc): # 类对外提供的方法
  11. self.showNickName();
  12. print("this is a secret:" + str(abc) );
  13. def addNum(self,*nums): # 类对外提供的方法,任意个数参数
  14. result = 0;
  15. for i in nums:
  16. result += i;
  17. return result;
  18.  
  19. a = animal();
  20. # print(a.__nickName); # 报错:AttributeError: 'animal' object has no attribute '__nickName'
  21. # print(a.__getNickName()); # 报错:AttributeError: 'animal' object has no attribute '__getNickName'
  22. a.showNickName();
  23. print(a.addNum(1,2,3,4,5));
  24. a.showNickNameAbc('Mike');

4、类的专有方法

  在python中,类中有一些以双下划线开始并且以双下划线结束的方法,我们称之为类的专有方法,比如 __init__ 方法是类实例化的时候调用的。

  1. __init__ 构造函数,生成对象时调用
  2. __del__ 析构函数,释放对象时调用
  3. __add__ 加运算
  4. __mul__ 乘运算
  5. __cmp__ 比较运算
  6. __repr__ 打印,转换
  7. __setitem__ 按照索引赋值
  8. __getitem__ 按照索引获取值
  9. __len__ 获取长度
  10. __call__ 函数调用
  1. #!/usr/bin/python
  2. class animal:
  3. name = "animal";
  4. num = 1;
  5. __nickName = "Some thing just like this"; # 类私有属性
  6. def __getNickName(self): # 类私有方法
  7. return self.__nickName;
  8. def showNickName(self): # 类对外提供的方法
  9. print("I have a NickName:" + self.__getNickName() );
  10. def __init__(self,nickName): # 类构造方法
  11. self.__nickName = nickName;
  12.  
  13. a = animal('Mike');
  14. a.showNickName();

5、类的继承

  前面已经提到类的继承了,新类可以继承父类的公用属性和共有方法,但是不能继承父类的私有属性和私有方法。

  python的类继承是多继承,一个类可以继承多个类,格式如下:

  1. class 新类名(父类1,父类2,...,父类n):
  2. <语句1>
  3. <语句2>
  4. ...
  5. <语句n>

6、类中重载方法和运算符

  继承父类之后,避免重命名函数,可以使用方法的重载来解决

  1. #!/usr/bin/python
  2. class animal:
  3. name = "animal";
  4. num = 1;
  5. def show(self): # 类对外提供的方法
  6. print(self.name);
  7. print(self.num);
  8.  
  9. class human(animal):
  10. name = "human";
  11. age = 100;
  12. def show(self): # 重载方法
  13. animal.show(self);
  14. print(self.age);
  15.  
  16. h = human();
  17. h.show();

运算符重载,对应的是类的专有方法:

  1. + __add__
  2. - __sub__
  3. * __mul__
  4. / __div__
  5. % __mod__
  6. ** __pow__
  1. #!/usr/bin/python
  2. class animal:
  3. name = "animal";
  4. num = 1;
  5. def show(self): # 类对外提供的方法
  6. print(self.name);
  7. print(self.num);
  8. def __add__(self,n):
  9. self.num += n;
  10.  
  11. h = animal();
  12. h.show();
  13. h+5; # 调用 __add__ 方法
  14. h.show();

可以在模块中定义类,在访问的类时候,就使用 “ 模块名.类名 ” 对类进行调用。

【python学习-5】面向对象的python的更多相关文章

  1. Python学习之==>面向对象编程(二)

    一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...

  2. python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍

    目录 python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍.md 一丶字典 1.字典的定义 2.字典的使用. 3.字典的常用方法. python学习第八讲,python ...

  3. python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍

    目录 python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍 一丶元祖 1.元祖简介 2.元祖变量的定义 3.元祖变量的常用操作. 4.元祖的遍历 5.元祖的应用场景 p ...

  4. python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍

    目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...

  5. python学习第四讲,python基础语法之判断语句,循环语句

    目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...

  6. Python学习一(面向对象和函数式编程)

    学习了一周的Python,虽然一本书还没看完但是也收获颇多,作为一个老码农竟然想起了曾经荒废好久的园子,写点东西当做是学习笔记吧 对Python的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...

  7. python学习之面向对象

    目录 __main__,__name__ __module__,__class__ __init__ __del__ __repr__,__str__ __mro__ __call__ __new__ ...

  8. python学习之路-1 python简介及安装方法

    python简介 一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. 目前最新版本为3.5.1,发布于2015年12月07日 ...

  9. python学习笔记1之-python简介及其环境安装

    python学习笔记之-python简介及其环境安装 最近几年python之火不用多说,最近开始利用时间自学python,在学习的过程中,按照自己的思路和理解记录下学习的过程,并分享出来,如果正好你也 ...

  10. Python学习【02】Python基础

    一.Python内部执行过程 1.Python的后缀名可以是任意? print("hello,world")  保存成  .py / .txt / .sb / .aaa 都可以用在 ...

随机推荐

  1. 收藏:Windows消息机制

    百度百科介绍的windows消息机制也不错:http://baike.baidu.com/view/672379.htm Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视 ...

  2. boost::unique_lock和boost::lock_guard的区别

    lock_guard unique_lock boost::mutex mutex; boost::unique_lock<boost::mutex> lock(mutex); std:: ...

  3. MySQL的replace方法

    mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便,mysql 替换函数replace()Update `table_name` ...

  4. win下jdk7环境变量的配置

    win下jdk7环境变量的配置: 单击计算机(Computer),选择属性(Properties),选择高级系统设置(Advanced systems settings), 选择环境变量(Enviro ...

  5. python获取指定目录下所有文件名os.walk和os.listdir

    python获取指定目录下所有文件名os.walk和os.listdir 觉得有用的话,欢迎一起讨论相互学习~Follow Me os.walk 返回指定路径下所有文件和子文件夹中所有文件列表 其中文 ...

  6. bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...

  7. bzoj千题计划210:bzoj2642 | Poj3968 | UVALive 4992| hdu 3761 Jungle Outpost

    http://www.lydsy.com/JudgeOnline/problem.php?id=2642 题意: n个瞭望台,形成一个凸n边形.这些瞭望台的保护范围是这个凸包内的任意点. 敌人进攻时, ...

  8. Chrome插件笔记之content_scripts

    一.概论 说这个之前先看一个段子,讲的是甲方有一奇葩客户,这客户看一网站某些样式很别扭不得劲,非要让乙方修改,乍一听没毛病,但关键是这网站不是乙方家的,根本没有修改权限,怎么办,客户就是上帝,上帝的要 ...

  9. Route Between Two Nodes in Graph

    Given a directed graph, design an algorithm to find out whether there is a route between two nodes. ...

  10. 统一过程模型(RUP/UP)

    http://blog.sina.com.cn/s/blog_6a06f1b7010121hz.html 统一过程(RUP/UP,Rational Unified Process)是一种以用例驱动.以 ...