【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();

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

原文地址:https://www.cnblogs.com/klbc/p/9479803.html

时间: 2024-10-10 16:10:08

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

python学习之面向对象高级特性

类属性与实例属性类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本.在前面的例子中我们接触到的就是实例属性(对象属性),它不被所有类对象的实例对象所共有,在内存中的副本个数取决于对象个数. 05_类属性鱼实例属性.py import random class Turtle(object): # power是类属性. power = 100 def __init__(self): # x,y:实例属性. self.x = random.randint(0, 10)

python学习笔记5:python读写文件

python学习笔记5:python读写文件 一.文件的打开模式 1.打开文件 1) f=open('D:\\a.txt','w') 第一个参数是文件的路径,如果只写文件的名字,默认是在当前执行目录下的文件:第二个参数是文件的打开模式 这种方式打开文件,在使用完了之后一定要记得,关闭文件: f.close() 2) with open('D:\\a.txt','w') as f 这种方式打开文件,文件在使用完后会自动关闭文件,不需要close  2. 文件的打开模式 总的来说,文件的打开模式有三

python学习笔记1——安装python

python学习笔记1--安装python centos和ubuntu的python2.7的安装方法参考:http://daixuan.blog.51cto.com/5426657/1767325 1.查看当前python版本并且 [[email protected] ~]# python -V Python 2.6.6 2.安装eple-release扩展源 [[email protected] ~]# yum install -y epel-release 3.安装pip [[email p

python学习手册——1介绍python对象类型

在python ,数据以对象的形式出现--无论是python提供的内置对象,还是使用python或是像C扩展库这样的扩展语言工具创建的对象.尽管在以后才能确定这一概念,但对象无非是内在中的一部分,包含数值和相关操作的集合. 由于对象是python 最基本的概念,从这一章开始我们将会全面地体验python的内置对象类型. python程序可以分解成模块,语句,表达式以及对象,如下所示: 1.程序由模块构成 2.模块包含语句 3.语句包含表达式 4.表达式建立并处理对象 为什么使用内置类型 1.内置

python学习笔记(01):python和c语言 标识符命名规则比较

python标识符命名规则:标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _ ’).标识符名称的其他部分可以由字母(大写或小写).下划线(‘ _ ’)或数字(0-9)组成.标识符名称是对大小写敏感的.例如,myname和myName不是一个标识符.注意前者中的小写n和后者中的大写N.有效 标识符名称的例子有i.__my_name.name_23和a1b2_c3.无效 标识符名称的例子有2things.this is spaced out和my-name. c语言标识符命

[python]学习Django中的python知识拾遗

1.使用正则表达式进行URL匹配 urlpatterns = patterns('', # ... (r'^time/plus/\d+/$', hours_ahead), # ... ) (1)使用r代表字符串是原始字符串,表示python不会对立面的反斜杠\转义符进行处理,使用正则表达式一般使用原始字符串. (2)使用\d+表示匹配1个或者多个数字,如果限定只能使用两个数字,则\d{1,2}. (3)如果要把正则表达式的某个数作为参数,则用小括号包起来,如(r'^time/plus/(\d{1

Python学习教程(Python学习路线):python—收集系统信息

Python学习教程(Python学习路线):python—收集系统信息  1.1 hashlib模块使用 获取文件的MD5值,和shell下的MD5sum一样 方法一:先实例化一个对象,再使用update做校验,最后十六进制查看hexdigest In [3]: import hashlib In [5]: md5 = hashlib.md5 In [6]: md5.update("a") In [7]: md5.hexdigest Out[7]: '0cc175b9c0f1b6a8

Python学习教程(Python学习路线+Python学习视频):Python数据结构

Python学习教程(Python学习路线+Python学习视频):Python数据结构   数据结构引言:   数据结构是组织数据的方式,以便能够更好的存储和获取数据.数据结构定义数据之间的关系和对这些数据的操作方式.数据结构屏蔽了数据存储和操作的细节,让程序员能更好的处理业务逻辑,同时拥有快速的数据存储和获取方式. 在这篇文章中,你将了解到多种数据结构以及这些数据结构在Python中实现的方式.    抽象数据类型和数据结构 数据结构是抽象数据类型(ADT)的实现,通常,是通过编程语言提供的

Python学习笔记-面向对象

一.什么是面向对象的程序设计 1.面向过程的程序设计 面向过程:核心是过程二字,过程即解决问题的步骤,就是先干什么,再干什么.基于该思想写程序就好比在设计一条流水线,是一种机械式的思维方式. 优点:复杂的过程流程化,进而简单化 缺点:扩展性差 2.面向对象的程序设计 面向对象:核心是对象二字,对象是特征与技能的结合体.基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成,是一种"上帝式"的思维方式 优点:可扩展性强 缺点:编程复杂度高,容易出现过度设计问题 二.类与对象 对象

Python学习8——面向对象

写在开头: 这部分学习总结本来应该是抽象的延续,但是我却不想用“抽象2”来给标题命名,我觉得这节的内容更适合称为“面向对象”. 下面是跟随<Python基础教程>(第3版)第7章来学习的. 创建自定义对象是Python的核心概念,Python可以同java语言一样,被视为是一种面向对象语言.在面向对象编程中,术语对象大致意味着一系列访问和操作这些数据的方法. 有一点java基础的同学应该都了解,面向对象的3个基本特征:封装,继承,多态. 多态:可对不同类型的对象执行相同的操作,而这些操作就像“