Python学习之面向对象
面向对象
面向对象编程(OOP)是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
面向对象的设计思想是抽象出Class,根据Class创建Instance
面向对象的特征:封装、继承、多态
学习面向对象,先了解一些技术名词。

类和实例
面向对象最重要的概念就是类(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中,__xxx__这个变量,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以我们不能使用这样的变量名。
记录学习笔记,有其他参考,如有侵权,联系删除
本文来自博客园,作者:rissa,转载请注明原文链接:https://www.cnblogs.com/rissa/p/15102614.html

浙公网安备 33010602011771号