Python多态,封装,继承

1.多态

可以对不同类型的对象执行相同的操作。

>>> object.get_price()
>2.5

像这样与对象属性相关联的函数称为方法

>>>from random import choice
>>>x=choice(['Hi','你好'[1,2,3,4,5,6,'e','r','r','t']])
>>>x.count('r')#只关心x内有几个r,可调用count
>2

从上述结果来看,x包含的是列表。关键在于无需执行相关的检查,只要x有一个名为count的方法,它就可以将单个字符作为参数并返回一整数
多态形式多样
每当不知道对象是什么样的,但能对其执行操作时。都是多态在起作用。这不仅仅适用于方法,还适用于内置运算符和函数。

>>>1+1
>2
>>>'act'+'ion'
>'action'

上述代码表明,加法运算符即可用于数字,也可用于字符串(以及其它类型的序列)
如果要编写一个函数,通过打印一条信息来指出对象的长度,可以像下面这样做:

>>>def length_message(x):
       print('这个数列是',repr(x),'长度为',len(x))
>>>length_message([1,2,3])
这个数列是 [1, 2, 3] 长度为 3

如你所见,这个函数还使用了reprrepr是多态的集大成者之一,可用于任何对象。

>>>length_message('黎明')
这个数列是 '黎明' 长度为 2#程序语句没改

很多函数和运算符都是多态的,你自己编写的也可能如此,即使你不是有意为之。破坏多态唯一办法是使用诸如type、issubclass等函数显示地执行类型检查。但是你应尽可能的避免以这种方式破环多态。

2.封装

向外隐藏不必要的细节。
多态是让你无需知道对象所属的类就能调用其方法,而封装是让你无需知道对象的构造就能使用它。听起来两者有些相似,举例说明:

>>>A=OpenObject()
>>>A.set_name('黎明')
>>>A.get_name()
>'黎明'
>>>global_name
>'黎明'
>>>global_name='黎明'
>>>A.get_name()
>'黎明'
>>>A1=OpenObject()
>>>A2=OpenObject()
>>>A1.set_name('灰烬')
>>>A2.get_name
>灰烬

如你所见,设置一个对象的名称时,将自动设置为另一个对象的名称。这可能不是你想要的结果。
基本上,你希望对象是抽象的:当调用方法时,无需操心其他的事情,如避免干扰全局变量。那如何将名称‘封装’在对象中呢?将其作为一个属性就行了。
属性是归属于对象的变量。和方法差不多。实际上,方法差不多就是和函数相关联的属性。
如果你使用属性而不是全局变量重新编写前面的类,并将其重命名为ClosedObject,就可以像下面这样使用它:

>>>c=ClosedObject()
>>>c.set_name('黎明')
>>>c.get_name
>'黎明'
>>>d=ClosedObject()
>>>d.set_name('灰烬')
>>>d.get_name
>'灰烬'#设置了新对象的名称
>>>c.get_name
>'黎明'

第一个对象的名称还在。因为这个对象有自己的状态。对象的状态由其属性(如名称)描述。对象的方法可能修改这些属性,因此对象将一系列函数(方法)组合起来,并赋予它们访问变量的(属性)的权限,而属性可用于在两次函数调用之间存储值。

3.继承

要想避免多次输入相同的代码,可以使用继承。
假如你已经有了一个类,并要创建一个新的类,但是新类和旧类很像(可能只是新增了几个方法),你又不想复制旧类的代码粘贴到新类中。该咋办呢?
可以让新类继承旧类的方法(让新类成为旧类的子类)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值