python封装继承多态的理解_Python面向对象-基础篇(封装、继承、多态)

面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)

类就是一个模板,模板里可以包含多个函数,函数里实现一些功能,对象则是根据模板创建的实例,通过实例对象可以执行类中的函数。

面向对象的三大特性是指:封装、继承和多态

1、封装

第一步:将内容封装到某处

self 是一个形式参数:

当执行obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1

当执行obj2 = Foo('alex', 78 ) 时,self 等于 obj2

所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存

第二步:从某处调用被封装的内容(两种)

1、通过对象直接调用被封装的内容

class Foo:

def __init__(self, name, age):

self.name = name

self.age = age

obj1 = Foo('wupeiqi', 18)

print obj1.name # 直接调用obj1对象的name属性

print obj1.age # 直接调用obj1对象的age属性

obj2 = Foo('alex', 73)

print obj2.name # 直接调用obj2对象的name属性

print obj2.age # 直接调用obj2对象的age属性

2、通过self间接调用被封装的内容

class Foo:

def __init__(self, name, age):

self.name = name

self.age = age

def detail(self):

print self.name

print self.age

obj1 = Foo('wupeiqi', 18)

obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18

obj2 = Foo('alex', 73)

obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78

综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容

2、继承

对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法

注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已

Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先

当类是经典类时,多继承情况下,会按照深度优先方式查找

当类是新式类时,多继承情况下,会按照广度优先方式查找(准确的说是C3算法,非广度优先)

方法重写:

如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法:

此时对象调用的是子类方法。

3、多态

Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚“鸭子类型”

class F1:

pass

class S1(F1):

def show(self):

print 'S1.show'

class S2(F1):

def show(self):

print 'S2.show'

def Func(obj):

print obj.show()

s1_obj = S1()

Func(s1_obj)

s2_obj = S2()

Func(s2_obj)

Python “鸭子类型”

面向对象的应用场景:

1、多函数需使用共同的值,如:数据库的增、删、改、查操作都需要连接数据库字符串、主机名、用户名和密码(这些字段可以定义未普通字段或私有字段)

2、需要创建多个事物,每个事物属性个数相同,但是值的需求

如:张三、李四、杨五,他们都有姓名、年龄、血型,但其都是不相同。即:属性个数相同,但值不相同

类和对象在内存中是如何保存?

答:类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值