Python笔记9——继承、多态和type、isistance、dir

来源:互联网 发布:手机号码采集器软件 编辑:程序博客网 时间:2024/05/24 23:15
1.当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)
2.判断一个变量是否是某个类型可以用isinstance()判断:isinstance(a,list)判断变量a是否为list类型,返回TRUE或FALSE
3.多态:对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定。
4.多态的威力在于:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保 run() 方法编写正
确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:
    对扩展开放:允许新增Animal子类;
    对修改封闭:不需要修改依赖Animal类型的 run_twice() 等函数。
5.用type()函数获取基本类型,该函数会返回type类型。便捷做法是用import types导入types模块。 注意:有一种类型就叫TypeType,所有类型本身的类型就是 TypeType,即: type(int)==type(str)==types.TypeType
6.用isistance()函数判断具有继承关系的class类型,也可以判断变量是否是某些类型中的一种:isinstance('a',(str,unicode))
7.使用dir()函数,获取一个对象的所有属性和方法。使用len()函数调用一个对象的长度。使用lower()函数返回小写的字符
8.上述的函数能够把属性和方法列出来,但是这还不够,配合 getattr()(获取属性或方法) 、 setattr()(修改属性或方法) 以及 hasattr()(测试属性或方法) ,我们可以直接操作一个对象的状态。如:
>>> class MyObject(object):
... def __init__(self):
... self.x = 9
... def power(self):
... return self.x * self.x
...
>>> obj = MyObject()
紧接着,可以测试该对象的属性:
>>> hasattr(obj, 'x') # 有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19
如果试图获取不存在的属性,会抛出AttributeError的错误:
>>> getattr(obj, 'z') # 获取属性'z'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'MyObject' object has no attribute 'z'
可以传入一个default参数,如果属性不存在,就返回默认值:
>>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
404
也可以获得对象的方法:
>>> hasattr(obj, 'power') # 有属性'power'吗?
True
>>> getattr(obj, 'power') # 获取属性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x108ca35d0>>
>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x108ca35d0>>
>>> fn() # 调用fn()与调用obj.power()是一样的
81
9.通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息。如果可以直接写:
sum = obj.x + obj.y
就不要写:
sum = getattr(obj, 'x') + getattr(obj, 'y')