面向过程编程
顺序写代码,类似与简单的shell脚本,代码在逻辑上是从上到下顺序执行
函数式编程
函数用来实现功能,使用的时候直接调用函数即可,不需要重复编写代码
面向对象
将函数封装到类里面,相对来说更直观,代码也会简单一些,使用的时候根据类生成实例,调用方法、属性、字段即可
python也是支持OOP的一种开发语言,(Object Oriented Programming,OOP,面向对象程序设计),
面向对象变编程,抽象出类似事物的属性,然后可以更好的重用代码,降低了开发的难度,使编程
可以像搭积木一样完成
面向对象编程有几个很重要的特性优点:
封装
继承
多态 (在python中不做介绍,用处不大)
在说上面三个特性前,先来了解几个概念
1. 对象 和 类
什么是对象?我们平时见的书、人、办公桌、自行车等都可以称为对象,对象会有一些固定和非固定的部分,对象包括属性和行为,属性就是对象身上静态的部分,行为就是对象身上动态的部分。将一大类对象的属性和行为抽象出来,就有了类,所以类就是对象的属性和行为的封装后载体。
举个栗子:
有个笑话是:秋天你把老婆埋到土里,秋天你就会有好多个老婆,一个老婆洗衣,一个老婆做饭,一个老婆给你捶腿,一个老婆给你揉肩。
这些个老婆有些东西都是共同的,有些东西是不同的,比如说,她们都有发型,肤色,身高,体重等
有些东西时不同的,比如说洗衣服、做饭、捶腿、揉肩。
类的定义:
class wife(): def cook(self): print "cooking" def chicken(self,food): print "cooking food is %s" % food class 关键字 wife 类名称 self 必须写,指对象自身,即类实例化以后的对象 类的实例化 laopo01 = wife() #实例化类wife,生成实例laopo01,也可以叫对象 laopo01.cook() #执行 laopo01的cook方法 laopo01.chicken("宫保鸡丁") # 执行chicken方法 laopo02 = wife() #实例化类wife,生成实例laopo02,也可以叫对象 laopo02.cook() #执行 laopo02的cook方法 laopo02.chicken("宫保鸡丁") # 执行chicken方法
类的封装:
封装的意思就是把事物共有的东西抽象出来,然后将抽象出来的东西打包到一起,就像上面的例子,老婆们都可以吃饭,走路,都有眼耳口鼻手,这些是共有的东西抽象后,封装到一起就是一个wife类。
class food(): def __init__(self,meat,efood): self.meat = meat # 封装字段 meat self.efood = efood # 封装字段 efood
def outp(self): print self.meat,self.efood # 调用字段的第一种方法 fo = food() fo.meat #调用字段的第二种方法 fo.efood
调用方法 第一种 类中内部调用,使用self直接调用封装在类中的字段 第二种 生成实例对象后调用,使用fo对象的 meat字段
类的继承:
继承就是,父与子的关系,子身上会有父身上的一些特性,他们也会有共同的一些东西,也有一些不同的东西。java和c# 部支持多继承, 但是python 是支持多继承的
简单例子: class dongwu: pass class cat(dongwu): pass class dog(dongwu): pass class ecat(cat,dongwu):
pass
类的多态 (可参考其他语言,python中作用不大,不做介绍):
多态性就是上面的例子中,一个共有的wife类可以用来制作多个老婆,wife就是制造laopo时使用的一个模板。
python类中的特殊方法
__init__ 也叫构造方法,在初始化实例的时候会立即自动调用,并且这个方法没有返回值 obj= Foo() #执行 __init___ __call__ obj() # 执行__call__ __del__ 类似于析构函数, __dict__ 查看类或对象中的所有成员 __str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值 class Foo: def __str__(self): return 'wupeiqi' obj = Foo() print obj # 输出:wupeiqi
关于经典类和新式类
经典类和新式类的区别在于,新式类继承自 object,
经典类 class dongwu: pass 新式类(推荐使用) class dongwu(object): pass
需要注意的一点:
在有相同继承管理的情况下,经典类和新式类的继承查找顺序不同
经典类 class A: pass class B(A): pass class C(A): pass class D(B,C): pass 在使用经典类的时候,在类D继承多个类的时候,如果被继承的类中有相同的方法,会按照深度优先的方法进行查找。 即:先在B中查找,再在A中查找,然后在C中查找 新式类 class A(object): pass class B(A): pass class C(A): pass class D(B,C): pass 在使用新式类的时候,在类D继承多个类的时候,如果被继承的类中有相同的方法,会按照广度优先的方法进行查找。 即:先在B中查找,再在C中查找,然后在A中查找 当类是经典类时,多继承情况下,会按照深度优先方式查找 当类是新式类时,多继承情况下,会按照广度优先方式查找 经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。
类成员
类有三种成员 方法、字段、属性,三种成员又可以细分:
类成员
1字段
a普通字段
b静态字段
2方法
a 普通方法
b 类方法
c静态方法
3属性
a普通属性
简单的例子来说明类成员的区别
class Foo(object): static_filed = "static_field" def __init__(self,name): self.name=name # 字段 pass def fun(self): #普通方法,可以加其他参数 print "fun" pass att_01 = property(fun) # 定义属性的另外一种方法 @classmethod def cfun(cls): # 类方法 ,不能加其他参数 print cls ,"classmethod" #cls== class,含义是:类本身 pass @staticmethod def sfun(): #可以加其他参数 print "staticmethod" pass @property def att(self): #属性,很少用 return "att" pass obj=Foo('aa') print obj.name # 字段 obj.fun() # 方法 print obj.att # 属性 print obj.static_filed # 不建议使用该方式调用静态字段 print Foo.static_filed # 建议使用该方式调用静态字段 Foo.cfun() # 类方法 Foo.sfun() #可以加其他参数
#属性和方法的区别
# 属性也是方法的一种;区别是属性前面有装饰器 @property ,调用的时候不用加括号
#普通方法 对象调用
#类方法 类调用,只能有一个参数,自动把当前类座位参数传递给方法 ,调用时 无需创建对象
#静态方法 类似与一个函数 调用时 无需创建对象
#属性的定义方法
#只适用与新式类的 属性的特性
class Foo(object): @property def att(self): #属性,很少用到 return "att" pass @att.setter def att(self,values): print "att.setter" @att.deleter def att(self,values): print "att.deleter"
成员修饰符
类成员分公有成员和私有成员
两者的区别是
私有成员开头以两个下划线开头,且不能被子类继承,外部无法调用,(有一种特殊情况可以调用,不推荐使用)
class Foo(object): pub = "public" #公有成员 , __priv = "private" # 私有成员,前面多了两个下划线,外部无法调用 def foo(self): print self.__priv # 调用私有字段 print "pub fun" def __foo(self): #私有方法,外部无法调用, print "private fun" def show(self): print self.__foo() #调用私有方法 aa = Foo() print Foo.__priv print aa.priv print aa._Foo__priv #特殊方法,不建议使用 _classname__var
参考 http://www.cnblogs.com/wupeiqi/p/4493506.html
http://www.timesnotes.com/?p=126
http://timesnotes.blog.51cto.com/1079212/1719752