面向对象编程(OOP)导论
面向对象编程是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。面向对象编程最核心的思想就是类的概念,面向对象的三大特点就是:数据封装,继承,派生.
在面向对象编程当中,我们可以给用户提供相应的接口函数(API),不仅保证了代码的安全性封装性,也减少了用户的开发流程。
1. 类(Class)和实例(Instance)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'A Class example'
__author__ = 'xu chao'
class Student(object): # 这里类后面加上了一个object表示继承关系,如果没有继承就写object,这是元类
def __init__(self, name, grade): # 注意init前后都有二个下划线,第一个参数是self, 后面是传进来的形参
self.name = name # self.name,self.grade为成员变量
self.grade = grade
def print_value(self): # 每一个函数第一个参数都是self
print('name=%s, grade=%s'%(self.name, self.grade))
student1 = Student('xuchao', 99) # 进行调用成员函数
student1.print_value()
- 类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响;
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;
通过在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节。
和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同。
2.访问控制
在上面写的程序当中,我们是可以直接取到self.name,或者对self.name进行操作,也就是说,这些成员变量对于用户来说访问权限是公有的(这点和C++不同,C++中默认成员变量和成员函数是私有的)。
问题:如何将对成员变量的访问权限变成私有的了?
我们可以使用:self.__name = name,self.__grade = grade,也就是我们可以在self之后加上二个下划线,这样我们就不可以在类之外访问我们的成员变量了。
如果将类的成员变量修改成私有的,那我们怎样进行访问他了?
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'A Class example'
__author__ = 'xu chao'
class Student(object): # 这里类后面加上了一个object表示继承关系,如果没有继承就写object,这是元类
def __init__(self, name, grade): # 注意init前后都有二个下划线,第一个参数是self, 后面是传进来的形参
self.__name = name # self.name,self.grade为成员变量
self.__grade = grade
def print_value(self): # 每一个函数第一个参数都是self
print('name=%s, grade=%s'%(self.__name, self.__grade))
def get_name(self): # 这是获取私有成员变量的值
return self.__name
def get_grade(self):
return self.__grade
def set_name(self, name): # 这是可以进行修改私有成员变量的值
self.__name = name
student1 = Student('xuchao', 99) # 进行调用成员函数
student1.print_value()
student1.__name = 'jack' # 直接通过这样赋值操作编译时没有任何错误的,但是并没有达到正确修改代码的作用
student1.print_value()
student1.set_name('jack') # 通过自己类里面的函数我们可以实现修改成员变量的功能
student1.print_value()
3. 继承与多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'xuchao'
class Animal(object): # 首先定义一个基类,Animal,这个类首先继承了这个object这个基类
def run(self):
print('animal is running') # 使用继承的好处就是如果子类继承了父类,那么子类就会继承父类的方法,这样开发起来很方便
class Dog(Animal): # Dog这个类继承了Animal这个类,我们称它为子类,称Animal为父类
def run(self): # 因为父类中存在了这个函数,我们在子类中重新写一个一样的函数,那么子类中就会代替父类的同名函数
print('dog is running')
class Cat(Animal):
def run(self):
print('cat is running')
dog = Dog()
dog.run()
cat = Cat()
cat.run()
关于变量继承小问题
a = Dog() # 这句话表示Dog()表示a是一个Dog对象
print(isinstance(a, Animal)) # 我们可以通过isinstance()函数判断一个变量是否为一个类型
a = Animal()
print(isinstance(a, Dog)) # 这二个例子表明了:如果一个变量是从父类继承的类的变量,那他一定是父类类型;反之不一定成立