▲面向对象编程OOP
Object Oriented Programming。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
▲类和实例
类Class是实例Instance的模板。实例是根据类创建的一个个具体的对象。
在Python中,定义类通过class关键字实现。创建实例,通过类名+()实现。示例代码如下:
#定义一个继承object的Student类 class Student(object): #__init__方法可以把name,score属性强制绑定到self,self指向创建实例的本身 def __init__(self, name, score): self.name = name self.score = score #封装print_score方法,类的方法第一个参数必须是self,实例调用时不用传递 def print_score(self): print(‘%s : %s‘ % (self.name, self.score)) def get_grade(self): if self.score > 90: print(‘A‘) elif self.score > 60: print(‘B‘) else: print(‘C‘) #创建一个实例,传入与__init__匹配的参数,self不用传递 michael = Student(‘maciael jackson‘, 92) michael.print_score() michael.get_grade()
示例代码运行结果:
maciael jackson : 92 A
▲访问限制
如果让类的内部属性不被外部访问,可以再属性的名字前加两个_。以__开头命名的属性在python中称为私有变量private。私有变量只有内部可以访问,外部不可访问。这样通过访问限制的保护,代码更加健壮。
如果要允许外部代码访问和修改私有变量的话,可以在类的定义中给私有变量(属性)增加get()和set()方法。
▲继承和多态
定义一个类Animal,再定义一个类Dog继承自Animal。那么Dog就是子类subClass,Animal就是父类或基类baseClass。
当两个类存在继承关系时,子类就获得了父类的全部方法。同时子类可以新增自己的方法,也可以重写父类的方法。这就是多态。
当我们定义一个class时,其实我们就是定义一种数据类型。可以用isinstance()判断某个对象是否是这个类型。
示例代码如下:
#定义一个继承object的类Animal class Animal(object): def run(self): print(‘Animal is running!‘) #定义一个类Animal的子类Dog class Dog(Animal): #重写父类的run()方法 def run(self): print(‘Dog is running!‘) #增加eat()方法 def eat(self): print(‘Dog is eating!‘) #创建一个Animal的实例dog1 dog1 = Animal() dog1.run() #创建一个Dog的实例dog2 dog2 = Dog() dog2.run() print(isinstance(dog1, Animal)) print(isinstance(dog1, Dog)) print(isinstance(dog2, Animal)) print(isinstance(dog2, Dog)) #多态 def run_again(animal): animal.run() run_again(dog1) run_again(dog2)
运行结果:
Animal is running! Dog is running! True False True True Animal is running! Dog is running!
▲获取对象信息
type()用来判断对象类型,返回type类型
isinstance()用来判断是否是某类型,返回boolean值
dir()获取对象的所有属性和方法,返回一个list
hasattr(), getattr(), setattr()可以直接操作一个对象的状态
示例代码如下:
>>> isinstance(‘abc‘, str) True >>> type(‘abc‘) <class ‘str‘> >>> dir(‘abc‘) [‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__getnewargs__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__mod__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__rmod__‘, ‘__rmul__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘capitalize‘, ‘casefold‘, ‘center‘, ‘count‘, ‘encode‘, ‘endswith‘, ‘expandtabs‘, ‘find‘, ‘format‘, ‘format_map‘, ‘index‘, ‘isalnum‘, ‘isalpha‘, ‘isd ecimal‘, ‘isdigit‘, ‘isidentifier‘, ‘islower‘, ‘isnumeric‘, ‘isprintable‘, ‘isspace‘, ‘istitle‘, ‘isupper‘, ‘join‘, ‘ljust‘, ‘lower‘, ‘lstrip‘, ‘maketrans‘, ‘partition‘, ‘replace‘, ‘rfind‘, ‘rindex‘, ‘rjust‘, ‘rpartition‘, ‘rsplit‘, ‘rstrip‘, ‘split‘, ‘splitlines‘, ‘startswith‘, ‘strip‘, ‘swapcase‘, ‘title‘, ‘translate‘, ‘upper‘, ‘zfill‘]