面向对象

面向对象编程(OOP)是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。

面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。

而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。

在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

面向对象的设计思想是抽象出Class,根据Class创建Instance

面向对象的特征:封装、继承、多态

学习面向对象,先了解一些技术名词。

Python学习之面向对象_数据

 类和实例

面向对象最重要的概念就是类(Class)和实例(Instance),类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。



class Student(object):
name = "小红"

def f(self):
return "这是类里面的一个方法"


# 类实例化
student = Student()

# 访问类的属性和方法
print(student.name) # 小红
print(student.f()) # 这是类里面的一个方法


通过class关键字定义类,类名通常是大写字母开头,(object)是表示该类是从哪个类继承下来的。如果没有合适的继承的类,object是所有的类都会继承的类。

由于类具有模板的作用,我们可以把一些属性强制绑定,通过__init__方法来实现。__init__相当于构造方法。



class Student(object):
# name = "小红"
# score = 100

def __init__(self, name, score):
self.name = name
self.score = score

def f(self):
return "这是类里面的一个方法"


# 类实例化
student = Student("小红", 99)

# 访问类的属性和方法
print(student.name) # 小红
print(student.score) # 99
print(student.f()) # 这是类里面的一个方法


__init__方法的第一个参数永远是self,表示创建的实例本身,可以把各种属性绑定到self。

有了__init__方法,在创建实例的时候,就不能传入空的参数,必须传入和__init__方法匹配的参数,但self不需要传,解释器会自己把实例传进去。

和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,除此之外,方法的参数和函数一样。

数据封装

面向对象的特征之一:封装。

上述Student类有两个数据,name和score,要访问这些数据,没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的方法,这样,就把“数据”给封装起来了。



class Student(object):
# name = "小红"
# score = 100

def __init__(self, name, score):
self.name = name
self.score = score

# def f(self):
# return "这是类里面的一个方法"

def get_score(self):
if self.score >= 95:
print("%s的成绩是优秀" % self.name)
elif self.score >= 80:
print("%s的成绩是良好" % self.name)
elif self.score >= 60:
print("%s的成绩是及格" % self.name)
else:
print("%s的成绩不及格" % self.name)


# 类实例化
student = Student("小红", 59)
student.get_score()  # 小红的成绩不及格


get_score()方法封装了具体的数据实现,我们直接通过实例变量调用方法就行,不需要知道具体的实现细节。

实例属性和类属性

给实例绑定属性的方法是通过实例变量,或者通过self变量。

直接在class中定义的属性是类属性,归类所有,类的所有实例都可以访问到。



class Student(object):
age = 19

def __init__(self, name, score):
self.name = name
self.score = score


def get_score(self):
if self.score >= 95:
print("%s的成绩是优秀" % self.name)
elif self.score >= 80:
print("%s的成绩是良好" % self.name)
elif self.score >= 60:
print("%s的成绩是及格" % self.name)
else:
print("%s的成绩不及格" % self.name)


# 类实例化
student = Student("小红", 59)
print(student.age)


age就是类属性。

千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

访问限制

在Java中,可以通过关键字public,private,protect修饰来进行访问权限控制,那么python呢?

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(prinvate),只有内部可以访问,外部不能访问。



class Student(object):
age = 19

def __init__(self, name, score):
self.__name = name
self.__score = score

def get_score(self):
if self.__score >= 95:
print("%s的成绩是优秀" % self.__name)
elif self.__score >= 80:
print("%s的成绩是良好" % self.__name)
elif self.__score >= 60:
print("%s的成绩是及格" % self.__name)
else:
print("%s的成绩不及格" % self.__name)


# 类实例化
student = Student("小红", 59)
print(student.age)
# print(student.name) # 变量没有加__外部可以访问
student.get_score()


加了__之后,name和score只能内部访问,外部不能访问。

如果外部代码需要修改或者获取name和score的时候,就需要增加set_name和set_score、get_name和get_score方法来实现。



class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score

def get_name(self):
return self.__name

def get_score(self):
return self.__score

def set_name(self, name):
self.__name = name

def set_score(self, score):
self.__score = score


# 类实例化
student = Student("小红", 99)
# 获取name和score
print(student.get_name())
print(student.get_score())

# 修改name
student.set_name("小明")
# 获取name
print(student.get_name())
# 修改score
student.set_score("88")
# 获取 score
print(student.get_score())


Python学习之面向对象_类属性_02

在python中,__xxx__这个变量,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以我们不能使用这样的变量名。