(1)面向对象和面向过程
》面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
》面向对象的程序设计以对象为单位,把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
以一个例子来说明面向过程和面向对象在程序流程上的不同之处。
假设我们要处理学生的成绩表,为了表示一个学生的成绩,面向过程的程序可以用一个dict表示:
std1 = { ‘name’: ‘ly’, ‘score’: 90 }
std2 = { ‘name’: ‘Bob’, ‘score’: 81 }
而处理学生成绩可以通过函数实现,比如打印学生的成绩:
def print_score(std):
print '%s: %s' % (std['name'], std['score'])
如果采用面向对象的程序设计思想,我们首选思考的不是程序的执行流程,而是Student这种数据类型应该被视为一个对象,这个对象拥有name和score这两个属性(Property)。如果要打印一个学生的成绩,首先必须创建出这个学生对应的对象,然后,给对象发一个print_score消息,让对象自己把自己的数据打印出来。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print '%s: %s' % (self.name, self.score)
(2)创建类和实例
类是抽象的,实例是具体的
class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()//创建实例就是在类名后加个(),创建Text类的实例t
t.prt()//调用实例方法
结果:
<__main__.Test instance at 0x10d066878>
//说明self本身是一个实例,代表当前对象的地址
__main__.Test
//指向类
(3)实例属性
创建完实例后,可以自由地给一个变量绑定属性,同时可以通过“.”来访问属性,如先给实例stu绑定一个属性值name
std1=student()
std1.name="ly"
std1.score=90
可以通过std1.print_score()访问std1对象的属性值
》注意到init方法的第一个参数永远是self,表示创建的实例本身,因此,在init方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。有了init方法,在创建实例的时候,就不能传入空的参数了,必须传入与init方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去。
如:
std1=student("ly",90)
然后可以通过std1.print_score()访问属性值
完整的关于实例和对象的例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Role(object):
ac=None
def __init__(self,name,role,weapon,life_value):#初始化方法,self是实例本身,谁调用这个self就是谁
self.name=name#成员变量
self.role=role
self.weapon=weapon
self.life_val=life_value
def buy_weapon(self,weapon):
print("%s is buying [%s]"%(self.name,self.weapon))
self.weapon=weapon
Role.ac="JP Brand"
p1=Role("lynn","police","B10", 90)
t1=Role("alex","terrorist","B11",100)
p1.buy_weapon("AK47")
t1.buy_weapon("B51")
p1.ac="China Brand"
print("p1:",p1.weapon,p1.ac)
print("t1:",t1.weapon,t1.ac)
运行结果:
lynn is buying [B10]
alex is buying [B11]
('p1:', 'AK47', 'China Brand')
('t1:', 'B51', 'JP Brand')
》你也可以通过一下函数的方式来访问属性:
》getattr(obj, name[, default]) : 访问对象的属性。
》hasattr(obj,name) : 检查是否存在一个属性。
》setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
》delattr(obj, name) : 删除属性。