本文共 1427 字,大约阅读时间需要 4 分钟。
这是面向对象的最后一个部分。
首先看两个函数。
1.isinstance(obj, cls)
检查是否obj是否是类 cls 的对象
2.issubclass(sub, super)
检查sub类是否是 super 类的派生类
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Bar: pass class Foo(Bar): pass obj = Foo() # obj,Bar(obj类型和obj类型的父类)的实例 ret = isinstance (obj, Bar) print (ret) ret = issubclass (Bar,Foo) print (ret) - - - - - - - - - - - - - - - - - - True False |
3.super
默认情况下,当子类和父类有同名的方法时候,子类的对象调用这个方法是调用的子类的方法。super可以强制调用父类的方法。
比如说
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class C1: def f1( self ): print ( 'c1.f1' ) return 123 class C2(C1): def f1( self ): # 主动执行父类的f1方法 ret = super (C2, self ).f1() print ( 'c2.f1' ) return ret obj = C2() m = obj.f1() print (m) - - - - - - - - - - - c1.f1 c2.f1 123 |
这种方式使得我们可以灵活地扩展现有的类,增加新的功能,而不需要去修改现有的代码。相对应的,如果使用装饰器的话 我们需要去修改原有的代码。
比如,通过super的方式自定义一个有序的字典,基本思路是把key放在一个列表里面,因为列表是有序的,因此我们取值的时候通过列表取到key,然后再通过key取到对应的value,最后重新拼接一下输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class MyDict( dict ): def __init__( self ): self .li = [] super (MyDict, self ).__init__() def __setitem__( self , key, value): self .li.append(key) super (MyDict, self ).__setitem__(key,value) def __str__( self ): temp_list = [] for key in self .li: value = self .get(key) temp_list.append( "'%s':%s" % (key,value,)) temp_str = "{" + "," .join(temp_list) + "}" return temp_str # obj = MyDict() obj[ 'k1' ] = 123 obj[ 'k2' ] = 456 print (obj) |