Python学习笔记——高级特性(二)

引言

今天学习Python的面向对象特征。比较流行的高级编程语言都少不了面向对象的编程。python作为一门具有强大生命力的编程语言,自然也支持面向对象。个人认为,python的面向对象编程特性,是python能够匹敌java语言的基础,python的模块及大量的模块库使得python语言的应用越来越广。今天就python面向对象编程进行详细介绍。

面向对象概念

面向对象是相对于面向过程的一种编程方式。
面向过程的编程方式由来已久,Basic、Pascal和C语言 都是面向过程的编程方式。这种方式非常的直观,需要写一个功能,直接就写几行实现方法。比如你需要操作一个人移动到某个点,直接就写代码修改一个人的坐标属性,逐格的让他移动到目标点就行了。
面向对象的编程方式,操作的是一个个的对象,比如你还是需要操作一个人的移动,你需要先实例化那个人的一个管理类对象,然后告诉这个“人”的对象,你需要移动到什么地方去。然后人就自己走过去了。至于具体是怎样走的,外部不关心,只有“人”对象本身知道。
可以说面向过程关注的是流程,这种思维方式以业务流程为主线,梳理各个函数和应用的工作流程,然后形成一个一个的函数。而面向对象的思维方式更接近于人们对现实世界的认识,将应用程序设计分解为不同的对象,关心的是对象的分解及对象之间的信息关系。
面向对象有4大基本特征:封装、继承、多态、抽象。估计背下来很容易,但实际上它们具体的含义是什么呢?
以动物为例,我们可以定义猫和狗等类,对猫和狗的属性和动作进行封装形成类。
1、封装:
以猫为例,猫具有眼睛、鼻子等基本属性,同时猫还有吃、睡、抓老鼠等动作,这样就可以定义类的属性和方法,我们把猫的眼睛、鼻子等特定定义为类的属性,把吃、睡、抓老鼠定义为猫的方法,通过将属性和方法封装起来,既可以形成类。

2、继承:
我们也可以定义哺乳动物类,作为哺乳动物,可以定义其一些基本特性,如哺乳、生孩子、睡觉等这些哺乳动物都有的方法。如果我们要定义猫的类,通常可以直接按照上面的方法定义,我们还可以在哺乳动物类的基础上继承,即将猫定义为哺乳动物的子类,在继承关系中,子类可以继承父类的属性和方法,我们只需要定义子类的特殊属性和方法即可。如继承自哺乳动物的猫类还可以定义捉老鼠等方法。

3、多态:

继承解决的是父与子的问题,多态解决的是兄弟差异性的问题。子类通过继承可以得到父类的属性和方法。当一个父类有多个子类时,同样的方法在不同的子类中可能有不同的实现,这时就需要用到多态。如猫时哺乳动物的子类,狗也是哺乳动物的子类,哺乳动物有吃的方法,而猫和狗也都有吃的方法,但是猫和狗的吃方法是有差别的,假设猫吃鱼,狗吃骨头,则其方法的实现是不一样的。在面向对象编程中,调用父类的抽象方法(未实现的方法)时,会根据子类的类型在程序运行时选择对应的方法执行,这就是多态,如调用哺乳动物的吃方法时,如果程序运行时哺乳动物的对象是猫,则会调用猫的吃方法,如果程序运行时哺乳动物的对象是狗,则会调用狗的吃方法
4、抽象
有些观点并没有把抽象列为面向对象的特征。但实际上这是面向对象的一个本质的东西。当定义一个类时,无法确切定义该类的方法实现时,该方法极为抽象方法,该类为抽象类,还是用多态中的例子,哺乳动物类中,由于不同哺乳动物的吃和睡觉的实现不一样,因此在哺乳动物类中无法实现这些方法,我们把这些方法定义为抽象方法,把哺乳动物类定义为抽像类。实际上抽象和多态通常是一起出现的。

Python的面向对象编程

理解了面向对象编程的概念后,我们开始学习python面向对象编程的语法。
Python作为一门动态语言,对类的定义不想静态语言一样严格,如定义鸭子类,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。如下面的代码定义了动物、狗和猫,其中狗和猫都继承自动物类。这里分别体现了类的封装、继承、多态等特点。
class Animal(object):
def run(self):
print(‘Animal is running…’)
class Dog(Animal):

def run(self):
    print('Dog is running...')

def eat(self):
    print('Eating meat...')

class Cat(Animal):

def run(self):
    print('Cat is running...')

def run_twice(animal):
animal.run()
animal.run()

run_twice(Animal())
Animal is running…
Animal is running…

run_twice(Dog())
Dog is running…
Dog is running…

run_twice(Cat())
Cat is running…
Cat is running…

可以直接在class中定义属性,这种属性是类属性

class Student(object):
name = 'Student’

当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。

s = Student() # 创建实例s
print(s.name) # 打印name属性

因为实例并没有name属性,所以会继续查找class的name属性
Student

print(Student.name) # 打印类的name属性
Student

s.name = ‘Michael’ # 给实例绑定name属性
print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
Michael

print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
Student

del s.name # 如果删除实例的name属性
print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值