一、什么是面向对象
之前我们学习过面向过程和函数式编程,在讲函数的时候有说过之所以有函数式编程是因为面向过程编程是根据业务逻辑从上到下垒代码,会出现大量代码的重用和臃肿,so,函数式编程将同一功能的代码封装起来,方便日后调用,避免重复编写。而随着业务逻辑的需求,函数式编程一样回出现面向过程同样的问题,于是就有了面向对象编程,以实现对函数进行分类和封装,减少代码量。
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
二、创建类和对象
面向对象编程其实就是对类和对象的使用。类就是一个模板,模板里可以包含多个函数,函数里实现一些功能;对象则是根据模板创建的实例,通过实例对象可以执行类中的函数。
class Too:#创建类名为Too的类 #创建类中的函数 def Air(self):#self是特殊参数,必填 pass obj=Too()#根据类Too创建对象obj
class Foo: def Bar(self): print('bar') def Hello(self,name): print('I am %s'%name) #根据类Foo创建对象obj obj=Foo() obj.Bar()#执行Bar方法 obj.Hello('tina')#执行Hello方法
三、面向对象的三大特性
1、封装
封装,就是讲相同的内容封装到某个地方,方便日后再去调用被封装在某处的内容。so,在使用面向对象的封装时,需要:
- 将内容封装到某处
- 从某处调用被封装的内容
#在对象中封装数据的方法一(不推荐): class Oldboy: def fetch(self,backend): print(backend,self) return 1 obj1=Oldboy()#创建对象,实例 #在对象中封装数据 obj1.backend='www.xxxxx' #执行类中的方法 a=obj1.fetch('www') print(a) #方法二(推荐): class Foo: def __init__(self,name,age):#称为构造方法,根据类创建对象时自动执行 self.name=name slef.age=age #根据类Foo创建对象 #自动执行Foo类的__init__方法 obj1=Foo('tina',18) obj2=Foo('feifei',22)
self是一个形式参数,当执行obj1=Foo('tina',18)时,self等于obj1,当执行obj2=Foo('feifei',22),self等于obj2
调用被封装的内容时,又分为两组情况:
(1)、通过对象直接调用:(对象.属性名)
class Foo: def __init__(self,name,age): self.name=name slef.age=age obj1=Foo('tina',18) print(obj1.name)#直接调用obj1对象的name属性 print(obj1.age)#直接调用obj1对象的age属性 obj2=Foo('feifei',22) print(obj2.name)#直接调用obj2对象的name属性 print(obj2.age)#直接调用obj2对象的age属性
(2)、通过self间接调用:(执行类中的方法时,通过self间接调用被封装的内容)
class Foo: def __init__(self, name, age): self.name = name self.age = age def detail(self): print(self.name) print(self.age) obj1 = Foo('tina', 18) obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 tina ;self.age 是 18 obj2 = Foo('feifei', 22) obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是feifei ; self.age 是 22
综上,对于面向对象的封装来说,实质就是使用构造方法将内容封装到对象中,然后通过对象直接或self间接获取被封装的内容。
class Person: def __init__(self,name,age,weight): self.Name=name self.Age=age self.Weight=weight def chi(self): self.Weight+=2 def excese(self): self.Weight-=1 o1=Person('tina',18,99) o1.excese() o1.chi() print(o1.Weight)
class Lianxi: def __init__(self,name,age,gender): self.name=name self.age=age self.gender=gender def sp(self): print('%s,%s岁,%s,sleeping'%(self.name,self.age,self.gender)) return 1 def rn(self): print('%s,%s岁,%s,running'%(self.name,self.age,self.gender)) def tk(self): print('%s,%s岁,%s,talking'%(self.name,self.age,self.gender)) obj1=Lianxi('tina',11,'girl') obj1.sp() obj1.rn() obj1.tk() obj2=Lianxi('feifei',18,'female') obj2.sp() obj2.rn() obj2.tk()
class Person: def __init__(self,name,gender,age,fighting): self.name=name self.gender=gender self.age=age self.fight=fighting def grassland(self): self.fight -=200 def practice(self): self.fight +=100 def scuffle(self): self.fight -= 500 def detail(self): t="姓名:%s ; 性别:%s ; 年龄:%s ; 战斗力:%s" % (self.name, self.gender, self.age, self.fight) print(t) obj1=Person('谢耳朵','men',12,10000) obj2=Person('莱纳德','male',11,2000) obj3=Person('珍妮','girl',13,7000) obj1.grassland() obj2.scuffle() obj3.practice() obj1.detail() obj2.detail() obj3.detail() ###########执行结果如下:############ 姓名:谢耳朵 ; 性别:men ; 年龄:12 ; 战斗力:9800 姓名:莱纳德 ; 性别:male ; 年龄:11 ; 战斗力:1500 姓名:珍妮 ; 性别:girl ; 年龄:13 ; 战斗力:7100
2、继承
面向对象中的继承跟生活中的继承一个道理,即:子可以继承父的内容。
python中继承跟其他语言不同的地方在于:Java或C++中面向对象的继承只能继承一个,即只能继承父类;而python中面向对象的继承则能继承多个,即可以继承父亲的又可以继承叔叔的,寻找方法的顺序则是从左到右进行溯源。
class Animals: def chi(self): print(self.name+'吃吃吃') def he(self): print(self.name+'喝喝喝') class Dog(Animals):#类名后面有括号就是继承,没括号就是基类 def __init__(self,name): self.name=name def jiao(self): print(self.name+'汪汪汪') obj1=Dog('xx') obj1.jiao() obj1.chi() obj1.he()
从上面的例子中,我们将基类Animals的方法继承给Dog,然后创建一个名字叫“xx”的狗对象,于是,叫“xx”的狗就可以直接调用基类的方法(属性)了,减少了很多共同特征的重复编写。
class Animal: def eat(self): print "%s 吃 " %self.name def drink(self): print "%s 喝 " %self.name def shit(self): print "%s 拉 " %self.name def pee(self): print "%s 撒 " %self.name class Cat(Animal): def __init__(self, name): self.name = name self.breed = '猫' def cry(self): print '喵喵叫' class Dog(Animal): def __init__(self, name): self.name = name self.breed = '狗' def cry(self): print '汪汪叫' # ######### 执行 ######### c1 = Cat('小白家的小黑猫') c1.eat() c2 = Cat('小黑的小白猫') c2.drink() d1 = Dog('胖子家的小瘦狗') d1.eat()
#!/usr/bin/env python #-*- coding:utf-8 -*- class Game_pmodel(object): def __init__(self,name,profession,attack=0,blood=0,speed=0): #构造函数,名字和职业等信息 self.name = name #定义普通字段 self.profession = profession #定义普通字段 self.attack = attack self.blood = blood self.speed = speed def supershuai(self): self.blood = self.blood + 1000 self.attack = self.attack + 1000 self.speed = self.speed + 1000 print "