isinstance

isinstance(obj1,obj2):判断对象与类之间的关系,判断第一个参数是否是第二个参数的实例。

>>> n1 = 10
>>> isinstance(n1, int) #判断n1是否是数字类型,如果是返回True如果不是防护False
True

>>> class A(object):
...     pass
...
>>> a1 = A()
>>> isinstance(a1, A)  # 判断a1是否是类A的对象,如果是返回True,如果不是返回False
True

type()函数和isinstance()函数两者有什么区别呢?

>>> print(type(1) is int)
True
>>> print(isinstance(1, int))
True

#从上面的结果看,两者的结果都是True,那么type()与isinstance()的区别在哪呢?
#从接下来的例子,就能够清晰看出来。

class A:pass
class B(A):pass

b = B()

print(isinstance(b, A)) # True
print(isinstance(b, B)) # True

print(type(b))  # <class '__main__.B'>
print(type(b) is B) # True
print(type(b) is A) # False

#总结:
    isinstance()是可以用在继承的关系上;而type()不能用来检测继承关系。

issubclass

issubclass(obj1,obj2):用来描述一个类与另一个类之间的关系,判断一个类是否是另一个类的子类

class A:pass
class B(A):pass

print(issubclass(B, A)) # True
print(issubclass(A, B)) # False

# 总结:
    类B是类A的子类,类A不是类B的子类

反射

什么是反射?

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

Python中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

四个可以实现自省的函数:hasattr getattr setattr delattr

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

getattr()

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') is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn't
    exist; without it, an exception is raised in that case.
    """
    pass
getattr

相关文章: