标题:
面向对象编程(OOP) -3
[打印本页]
作者:
look_w
时间:
2019-3-14 19:22
标题:
面向对象编程(OOP) -3
静态语言VS动态语言
对于静态语言(如JAVA)来说,如果需要传入Animal类型,那么你传入的必须是Animal类或者是它的子类,,否则无法调用run()方法
对于Python这样的动态语言来说,不一定需要传入Animal类型.我们只需要保证它传入的类型中包含run()方法
这就是动态语言的"鸭子类型",它不要求严格的继承体系,一个对象"只要看起来像只鸭子,走起路来像只鸭子,那么它就可以被当做鸭子"
动态语言的鸭子类型特点决定了继承不像是静态语言那样是必须的.
获取对象信息
我们拿到一个对象引用的时候,如何知道这个对象是什么类型,有什么方法呢?
使用type() 判断对象的类型
判断基本类型可以直接写int str等
对于class的继承关系来说,type()判断很不方便,我们要判断class的类型,可以使用isinstance()函数, isinstance()函数可以判断一个对象是否是该类本身.或者是否位于该类的父继承链上
# object--->Animal--->Dog--->Husky 继承关系
a = Animal()
d = Dog()
h = Husky()
print(isinstance(h, Husky))
print(isinstance(h, Dog))
能用type()判断的也基本可以用isinstance()判断
print(isinstance('a', str))
print(isinstance('b', int))
并且可以判断一个变量是否是某些数据类型中的一种
# 判断是否是list或tuple中的一种
print(isinstance([1, 2, 3], (list, tuple)))
print(isinstance((1, 2, 3), (list, tuple)))
总是优先使用isinstance()函数,把指定类型及其子类一网打尽
dir() 获取一个对象的所有属性和方法,在python中任何一种数据类型都可看做是一个对象.它返回的是一个包含字符串的list.
类似xxx的属性和方法在Python中都是有特殊用途的,
# 比如__len__方法返回长度,在Python内部,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__方法
print(len('abc'))
print('abc'.__len__)
把属性和方法列出来是不够的,配合hasattr()是否有某个属性或者方法 getattr() 获取某个属性或者方法 setattr() 设置某个属性或者方法为什么
# 我们希望从文件流fp中读取图像,我们要首先判断fp对象是否有read()方法,如果存在,该对象就是一个流,如果不存在,该对象就无法读取,hasattr()就派上用场了
def readImage():
if hasattr(fp, 'read'):
return readData(fp)
return None
# 请注意在Python这类动态语言中,根据鸭子模型,有read()方法,不代表该fp对象就是一个文件流,它有可能是一个网络流,也有可能是内存中的一个字节流,但是只要是read()方法返回的是有效的图像数据,就 不影响读取图像的功能
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0