初识面向对象:

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-面向对象编程(一)的更多相关文章

  1. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  2. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  3. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

  4. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  5. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  6. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  7. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  8. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

  9. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

  10. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

随机推荐

  1. Ajax工作原理(转)

    1.ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax ...

  2. Selenium+WebDriver+Python 定时控制任务

    为了更对得起"自动化测试"的名号,我们可以设置定时任务,使我们自动化脚本在某个时间点自动运行脚本,这样就可以让测试在夜间进行,减少了时间成本.通过程序来控制test case在什么 ...

  3. 简进祥-SVN版本控制方案:多分支并行开发,多环境自动部署

    两地同时开发一个产品,目前线上有3个环境:测试环境.预发布环境.生产环境.目前系统部署采用jenkins自动化部署工具 用jenkins部署的方案 jenkins 测试环境:配置了各个分支的svn 地 ...

  4. 关于IOS时间日历的一些注意事项 NSDateFormatter

    1.时间或者日期格式化的格式化,在真机上运行的是hi,必须指定是在哪个区域的,不然在真机无法显示 // 1.日期格式化 NSDateFormatter *fmt = [[NSDateFormatter ...

  5. javaweb项目打包成war包

    从来没有想过web项目还能打包的,但是有要求,就不得不去实现,在网上找了一下,发现挺简单的. 首先是使用MyEclipse将web项目打包,如下图所示. 右键选中项目,选择export. 然后选择J2 ...

  6. 说说markdown和latex的简单比较

    latex是纯学术风格,写paper写书用 markdown是程序员风格,写笔记贴代码片段用 简单说,latex适合长篇.精致,比如数学公式.图片位置调整.表格样式调整.而markdown就是粗线条, ...

  7. Android成长日记-ContextMenu实现上下文菜单

    一. ContextMenu的组成 标题以及标题图标 菜单内容 菜单内容的点击事件 二. ContextMenu与OptionMenu的区别 OptionMenu对应的是activity,一个acti ...

  8. SPOJ375 Query on a tree

    Description You are given a tree (an acyclic undirected connected graph) with N nodes, and edges num ...

  9. C++ 之 const references

    extraction from The C++ Programming Language 4th. ed., Section 7.7 References, Bjarne Stroustrup To ...

  10. AngularJs $interpolate 和 $parse

    $interpolate 将一个字符串编译成一个插值函数.HTML编译服务使用这个服务完成数据绑定. 使用:$interpolate(text,[mustHaveExpression],[truste ...