这是面向对象的最后一个部分。
首先看两个函数。
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)
|
本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1858805,如需转载请自行联系原作者