一,什么是面向对象?
面向对象,Object Oriented Programming,简称oop。是一种程序设计思想。
中心:将对象作为程序的基本单元。一个对象包含了数据和操作数据的函数。
python,一切皆对象。
二,类和实例
类,class,抽象的模板。
实例,instance,根据类创建出来的一个个具体的“对象”。
定义一个类并实例化:
class test(object): #class关键字用于定义类,(object)是指,进程于object类
def __init__(self,name,result): #__init__是构造函数,可以理解为,实例化变量时默认执行的函数,第一个参数必须是selt
self.name=name #name和result分别为test的属性,在实例化的时候需要传入
self.result=result
t1=test('a','ok') #实例化对象,name=a,result=ok
类中的属性,就是通过构造函数来添加的。
接下来来看,类方法的定义:
def testfun(self): #第一个参数必须为self,可以接收各种参数,默认参数,关键字参数,可变参数等。
return self.result.upper() #可以通过self对对象属性进行操作。
三,面向对象的特点
1,数据封装
类方法的出现来源于这样一个简单对比:
对于上例中,返回对象的result并且大写,我们可以有两种实现方案,除了类方法,还可以在类外部定义一个方法,来获取并转化。
def fun():
return (t1.result.upper())
print(fun())
这样的实现,从结果上来看,并没有任何的瑕疵。
但是,两点需要考虑:
1>定义一个类,要和其他人共同使用时,每个人都写一个方法太过繁琐。
2>直接利用对象,获得属性进行操作,可能会在过程中引起属性被更改。
类方法的出现,正是基于数据封装的思想,来解决这两类情况。
公共操作全部定义成类方法,直接调用保证数据安全性。
2,继承
继承是面向对象的另一个特性。
在上面的例子中,定义类时,我们发现有个:(object)。
是指,我们的类继承于object这个类,而此时,object就是test的基类,而test,就是object的子类。
继承的意义在于,子类可以直接通过继承,获得父类的全部功能。(隐隐有点像拼爹……)
实例:(上面的例子不太好,重新写一个基类,Transportation,交通工具)
class Transportation(object): #交通工具基类
def run(self): #run方法
return 'Transportation is running'
class car(Transportation): #car类,继承于交通工具,然后啥也没干
pass
class bus(Transportation): #bus类,继承于交通工具,然后啥也没干
pass
c=car() #实例化
b=bus()
print(c.run()) #啥也没干就继承了一个run方法
print(b.run())
运行结果:
可是,car和bus,都输出的是transportation is running,有点……不人性化,怎么能让它有所区别?下一个特点,多态!
3,多态
针对上一个问题,首先,我们可以对继承的方法进行重写。
其次,多态是指,当调用类方法时,对于不同的子类,调用实际类型的类方法。
一个例子:
class Transportation(object):
def run(self):
return 'Transportation is running'
class car(Transportation):
def run(self):
return 'car is running'
class bus(Transportation):
def run(self):
return 'bus is running'
t=Transportation()
c=car()
b=bus()
def test(Transportation):
return Transportation.run()
print(test(t))
print(test(c))
print(test(b))
运行结果: