Python-面向对象编程(一)
初识面向对象:
Python中一切皆对象,我自己,我的电脑,电脑桌,都称之为一个对象.对象是类的一个实体.
我们可以通过行为和特征(属性)来描述一个对象,比如小狗,它有四条腿,一个尾巴,两个虎牙,这就是它的特征,它会汪汪叫,会摇尾巴等这就是它的行为.所有一个真实的对象具备两方面的特征,行为和特征(属性)。
在python中,一个对象的特征也称为属性(attribute)。它所具有的行为也称为方法(method)
结论:对象=属性+方法
在python中,把具有相同属性和方法的对象归为一个类(class),比如人类,动物,植物等等,这些都是类的概念。
类是对象的模板或蓝图,类是对象的抽象化,对象是类的实例化。类不代表具体的事物,而对象表示具体的事物.
一.创建类和对象:
- 1.self
- 类的方法与普通的函数只有一个特别的区别--他们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。
3 这个特别的变量指对象本身,按照惯例它的名字是self.- 2.如果你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1,arg2)的时候,这会由Python自动转为
5 MyClass.method(MyObject,arg1,arg2)- #############################################创建类MyClass(object)################
- class MyClass(object): #定义MyClass类
9 def method(self,arg1,arg2): #定义method方法.其中self为特殊参数,必填.
print """- arg1 is %s
- arg2 is %s """ %(arg1,arg2)
- MyObject = MyClass() #创建MyObject对象(实例)
- MyObject.method("Saneri",29) #<==> MyClass.method(MyObject,"Saneri",29) #执行MyClass.method()方法
- #############################################
二.属性
在类中我们可以定义一些属性,比如:
- class people:
- name = 'Saneri'
- age = 18
- P = people()
- print P.name,P.age
定义了一个people类,里面定义了name和age属性,默认值分别为'Saneri'和18。在定义了类之后,就可以用来产生实例化对象了,这句P = people( )实例化了一个对象p,然后就可以通过P来读取属性了。这里的name和age都是公有的,可以直接在类外通过对象名访问,如果想定义成私有的,则需在前 面加2个下划线 ' __'
- class people:
- __name = 'Saneri' #私有属性
- __age = 18 #私有属性
- p = people()
- print p.__name,p.__age #会报错,私有属性不能再外部进行调用.
- ##################################
- 私有属性是不能够在类外通过对象名来进行访问的.
- 私有属性只能通过类里面的方法去调用.
三.方法
在类中可以根据需要定义一些方法,定义方法采用def关键字,在类中定义的方法至少会有一个参数,,一般以名为'self'的变量作为该参数(用其他名称也可以),而且需要作为第一个参数。下面看个例子:
- class people(object):
- def __init__(self,name,age): #构造方法
- self.__name = name #
- self.__age = age
- def getName(self): #定义方法
- print self.__name
- def getAge(self):
- print self.__age
- P = people("Saneri",18)
- P.getName()
- P.getAge()
- ##执行结果######################
- Saneri
- 18
四.类中内置的方法:
在Python中有一些内置的方法,这些方法以2个下划线开始然后以2个下划线结束的方式定义.
- __doc__ #表示类的描述信息
- __init__(self,...) #初始化对象,在创建新对象时调用
- __del__(self) #释放对象,在对象被删除之前调用
- __str__(self) #在使用print语句时被调用
- __call__(self,*args) #把实例对象作为函数调用
- __getitem__(self,key) #获取序列的索引key对应的值,等价于seq[key]
- __module__ #表示当前操作的对象在那个模块
- __class__ #表示当前操作的对象的类是什么
- __dict__ #类或对象中的所有成员
- __getattr__(s,name) #获取属性的值
- __setattr__(s,name,value) #设置属性的值
- __delattr__(s,name) #删除name属性
- #######################################################
其他的内置属性请参考链接:http://www.cnblogs.com/simayixin/archive/2011/05/04/2036295.html
面向对象的三大特性:
面向对象的三大特性是指:封装、继承和多态.
一、封装
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。
- class person: #定义了一个person类.
def info(self,name,age): #定义了一个info方法
print """- name is %s
- age is %s """ %(name,age)
- #person().info("saneri",29)
- P = person() #实例化了一个对象P,将“saneri,29封装到name,age属性中.”
P.info("saneri",29) #定义属性,应用info方法.
"""
上面代码中,我们定义一个person类,定义一个info方法,但没有定义属性,因为属性不属于类,而是属于各个类的实例。也就是说属于对象,因此我们可以给每个实例设置不同的属性。
"""
- #__init__初始化 //对实体进行初始化
"""
创建类时,可以定义一个特定的方法,名为__init__(),只要创建这个类的一个实例,就会运行这个方法。可以向__init__()方法传递参数,这样创建对象时就可以把属性设置为你希望的值- __init__()这个方法会在创建对象时完成初始化.
"""
- class person:
- def __init__(self,nationality): #构造方法
- self.country = nationality #让下面的info函数可以调用 nationality,方法是将变量nationality赋值给这个类
- def info(self,name,age):
- print """
- name is %s
- age is %s
- nationality is %s""" %(name,age,self.country)
- #person().info("saneri",29)
- P = person("CN") #绑定到一个实例
- P.info("saneri",29)
- #类的绑定
- class Person:
- def __init__(self,name,nationality,age,sex,job): #构造方法
- self.Name = name
- self.Nationality = nationality
- self.Age = age
- self.Sex = sex
- self.Job = job
- def talk(self,msg=0):
- self.msg = msg #让其他变量可以调用.
- if self.msg != 0:
- print """
- name is %s
- nationality is %s
- age is %s
- sex is %s
- job is %s """ %(self.Name,self.Nationality,self.Age,self.Sex,self.Job)
- def skill(self):
- if self.Job == 'IT Engineer':
- print """To be IT Engineer,you must need to below skiils:
- 1.Linux/Unix
- 2.databases
- 3.Shell,Python """
- #Person("saneri","CN",29,"male","IT Engineer").talk(1)
- #Person("saneri","CN",29,"male","IT Engineer").skill()
- p = Person("saneri","CN",29,"male","IT Engineer")
- p.talk(1)
- p.skill()
二、 类的继承:
对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法
- #类的继承
- class person(object): #基类
- def __init__(self,Type,Sex,Age,Name):
- self.type = Type
- self.sex = Sex
- self.age = Age
- self.name = Name
- def info(self,msg=0):
- self.Msg = msg
- if self.Msg != 0:
- print self.name,"Saying:",self.Msg
- else:
- print "hello,%s dengyu" %self.Msg
- #P = person("It","male",29,"saneri")
- #P.info(1)
- class person_info(person): #派生类
- def __init__(self,Type,Sex,Age,Name,nation,work,salary): #继承基类字段,并添加新的字段
- person.__init__(self,Type,Sex,Age,Name) #将基类的初始化变量继承过来
- self.country = nation
- self.job = work
- self.salary = salary
- def tell(self,msg):
- input = raw_input("Plz input your name:")
- if input == self.name:
- print """%s's personal information:
- Name :%s
- Age :%s
- Nation :%s
- Work :%s
- Msg :%s
- """ %(self.name,self.name,self.age,self.country,self.salary,msg)
- P = person_info("IT","male",29,"Saneri","ShanXi","job","")
- P.tell('ylemail2012@sina.cn')
那是否可以继承多个类呢? 答案是肯定的.但是不建议初学者这么做.
1、Python的类可以继承多个类,Java和C#中则只能继承一个类
2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先.
- 当类是经典类时,多继承情况下,会按照深度优先方式查找
- 当类是新式类时,多继承情况下,会按照广度优先方式查找
那么问题又来了,什么是经典类和新式类呢。好,请看下图.
经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。
- class D:
- def bar(self):
- print 'D.bar'
- class C(D):
- def bar(self):
- print 'C.bar'
- class B(D):
- def bar(self):
- print 'B.bar'
- class A(B, C):
- def bar(self):
- print 'A.bar'
- a = A()
- # 执行bar方法时
- # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
- # 所以,查找顺序:A --> B --> D --> C
- # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
- a.bar()
- 经典类多继承
经典类多继承
- class D(object):
- def bar(self):
- print 'D.bar'
- class C(D):
- def bar(self):
- print 'C.bar'
- class B(D):
- def bar(self):
- print 'B.bar'
- class A(B, C):
- def bar(self):
- print 'A.bar'
- a = A()
- # 执行bar方法时
- # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
- # 所以,查找顺序:A --> B --> C --> D
- # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
- a.bar()
新式类多继承
三、多态
Pyhon不支持多态并且也用不到多态,这里简单带过,不做过多介绍.
整理参考文件:http://www.cnblogs.com/wupeiqi/p/4493506.html
Python-面向对象编程(一)的更多相关文章
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
随机推荐
- 51nod 1007 正整数分组
将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的. Input 第1行:一个数N,N为正整数的数量 ...
- java 附件上传时后台验证上传文件的合法性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- 【USACO 1.3】Barn Repair
贪心,去掉最大的min(m,c)-1个间隔 /******************************************* TASK: barn1 LANG: C++ Created Tim ...
- iOS进度条显示
一.实现下载文件进度控制 1.代码示例 1 #import "YYViewController.h" 2 3 @interface YYViewController () 4 @p ...
- MAC OS VPN使用指南
L2TP/IPSec VPN - Mac OS 使用指南 一.打开Mac的联网设置. 二.然后点左边的加号,添加新的连接. 三.选择VPN(L2TP),点击创建(Create). 四.输入你购买的VP ...
- android开发之自定义组件
android开发之自定义组件 一:自定义组件: 我认为,自定义组件就是android给我们提供的的一个空白的可以编辑的图片,它帮助我们实现的我们想要的界面,也就是通过自定义组件我们可以把我们要登入的 ...
- MapReduce多重MR如何实现
一.每次输出文件存在很烦人 // 判断output文件夹是否存在,如果存在则删除 Path path = new Path(otherArgs[1]);// 取第1个表示输出目录参数(第0个参数是输入 ...
- BZOJ1040 [ZJOI2008]骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...
- Nuget包里的依赖包更新到最新版本会不会随主包回滚到旧包的研究
A包中有几个依赖包:A-1包,版本:>=1.0:但是我项目上已经引用了A-1包的2.0版本,那么我添加A包的时候,不会将A-1包2.0版本改成1.0版本,会直接用2.0版本的.
- PHP Lex Engine Sourcecode Analysis(undone)
catalog . PHP词法解析引擎Lex简介 . PHP标签解析 1. PHP词法解析引擎Lex简介 Relevant Link: 2. PHP标签解析 \php-5.4.41\Zend\zend ...