面向对象编程(OOP):把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
三大特点:数据封装、继承、多态
1、类和实例
类(class):抽象概念,比如学生这个概念
实例(instance):具体的一个个学生
定义类 :
class 类名(object):
pass
类名通常是大写开头的单词,(object)表示从哪个类继承下来,没有合适的继承类,就用object 类
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
用_init_方法,绑定必要属性。其中,self表示创建的实例本身,永远不变
创建实例的方法:Student(name1,score1)
和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。
数据封装:在类的内部定义访问数据的函数(类的方法)
要定义一个方法,除了第一个参数是self
外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了self
不用传递,其他参数正常传入。
2、访问限制
如果要让class的内部属性不被访问,可以把属性的名称前加两个_,变成私有变量。这样就只能内部访问而外部不能访问。这样可以确保外部代码不能随意修改对象内部的状态。
如果外部代码要获取属性,可以给类增加方法:
class Student(object):
def __init__(self, name, score):
self.__name = name #定义私有变量
self.__score = score
def get_name(self): #获取name属性
return self.__name
def get_score(self): #获取score属性
return self.__score
def set_score(self, score): #修改score
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('bad score')
3、继承和多态
class 类名(object):定义一个新的class时,可以从现有的某个class继承。新的class叫子类(subclass),被继承的叫基类、父类或超类(Base class、Super class)。
继承特点:
1、获得父类全部功能;
2、可以对子类增加一些方法;
3、多态:当子类和父类都存在相同的方法时,子类的方法覆盖了父类的,在代码运行的时候,总是会调用子类的方法
4、获取对象信息
type():判断类型,基本类型都可以判断,但对于class的继承关系,不好判断
isinstance( ):
优先使用isinstance
dir( ):获得对象的所有属性和方法,返回一个包含字符串的list。
5、实例属性和类属性
实例属性: 各个实例所有,各不干扰
class Student(object):
def __init__(self, name):
self.name = name
类属性:所有实例共享一个属性
class Student(object):
name = 'Student'
注意:在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。