铁乐学
python
2018/04/18 13
铁乐学
python_day23_
面向对象进阶
1_
反射
以下内容大部分摘自博客
cnblogs/Eva-J/
isinstance()
和
issubclass()
两者的返回值都是布尔值
isinstance()
能够检测到继承关系
type()
只能单纯的判
断类
isinstance()
判断一个对象和一个类有没有血缘关系
issubclass()
接收两个参数,前一个是子类名,后一个是父类名
如果返回
True,
说
明有父子
(
继承
)
关系。
isinstance(obj,cls)
检查
obj
是否是类
cls
的对象
class Foo(object): passobj = Foo()
#
实例化
isinstance(obj, Foo)issubclass(sub, super)
检查
sub
类是否是
super
类的派生
类
class Foo(object): passclass Bar(Foo): passissubclass(Bar, Foo)issubclass
可以追溯
到
更远的源头,例如:
class
tuple_A():
passclass
grandfather_B(tuple_A):
passclass
father_C(grandfather_B):
passclass
son_D(father_C):
passprint(issubclass(son_D,
tuple_A))
#
返回
True
,是不是很像吸血鬼家族呢?
1
什么是反射
反射的概念是由
Smith
在
1982
年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行
为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性
的研究。它首先被程序语言的设计领域所采用
,
并在
Lisp
和面向对象方面取得了成
绩。
2
python
面向对象中的反射:
通过字符串的形式操作对象相关的属性。
python
中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数:
下列方法
适用于类和对象(一切皆对象,类本身也是一个对象)
1
)
hasattr(*args, **kwargs)def hasattr(*args, **kwargs): # real signature unknown
Return whether
the
object
has an attribute with
the
given
name.
This
is done
by
calling
getattr(obj,
name)
and
catching
AttributeError.
pass2
)
getattr(object,
name,
default=None)def
getattr(object,
name,
default=None):
#
known
special
case
of
getattr
getattr(object, name[, default]) - value Get a named attribute from an object; getattr(x,
‘y’)