面向对象编程一
一、面向对象编程——Object Oriented Programming
简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
class
后面紧接着是类名,即Student
,类名通常是大写开头的单词,紧接着是(object)
,表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object
类,这是所有类最终都会继承的类。
定义好了Student
类,就可以根据Student
类创建出Student
的实例,创建实例是通过类名+()实现的:
注意到__init__
方法的第一个参数永远是self
,表示创建的实例本身,因此,在__init__
方法内部,就可以把各种属性绑定到self
,因为self
就指向创建的实例本身。
有了__init__
方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__
方法匹配的参数,但self
不需要传,Python解释器自己会把实例变量传进去:
二. 面向对象的事例
1. 计算圆的面积与周长
from math import pi class Circle: def __init__(self,r): self.r=r def area(self): return pi*(self.r**2) def perimeter(self): return 2*pi*self.r obj=Circle(3) print(obj.r) print(obj.area()) print(obj.perimeter())
2.计算正方形的面积与周长
class Square: def __init__(self,long): self.long=long def area(self): return self.long**2 def perimeter(self): return self.long*4 bianchang=Square(5) print('正方形面积为:%d'%bianchang.area()) print('正方形周长为:%d'%bianchang.perimeter())
3.小明老张老王活动
class AAA(): def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def climb(self): print('%s,%s岁,%s,上山去砍柴'%(self.name,self.age,self.sex)) def drive(self): print('%s,%s岁,%s,开车去东北'% (self.name, self.age, self.sex)) def play(self): print('%s,%s岁,%s,最爱大保健'% (self.name, self.age, self.sex)) xm=AAA('小明','10','男') xm.climb() xm.drive() xm.play() lz=AAA('老张','90','男') lz.climb() lz.drive() lz.play() lw=AAA('老王','70','男') lw.climb() lw.drive() lw.play()
4.人狗大战
class Person(): role='person' def __init__(self,name,aggress,hp): self.name=name self.aggress=aggress self.hp=hp def attack(self,dog): dog.hp-=self.aggress class Dog(): role='dog' def __init__(self,name,kind,aggress,hp): self.name=name self.kind=kind self.aggress = aggress self.hp = hp def bite(self,persons): persons.hp-=self.aggress erlang=Person('二郎神',100,1000) wang=Dog('哮天犬','狼狗',50,300) print(erlang.hp) wang.bite(erlang) print(erlang.hp) print(id(Person.role)) print(id(Dog.role))