14. issubclass() 与 isinstance()
- issubclass()用于判断类对象与类对象之间的关系
- isinstance()用于判断实例对象与类对象之间的关系
1. issubclass():
- 接受两个参数:
第一个实参是类对象
第二个实参是类对象或实例对象组成的元组
- 第二个实参是类对象时,如果第一个类对象是第二个实参的子类则返回True
- 第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象的子类则返回True
>>> class A(object):
>>> pass
>>> class B(object):
>>> pass
>>> class C(object):
>>> pass
>>> class D(A):
>>> pass
>>> issubclass(D, A)
True
>>> issubclass(D, B)
False
>>> issubclass(D, (A, B, C))
True
>>> issubclass(D, (B, C))
False
2. isinstance():
- 接受两个参数
第一个是实例对象
第二个是类对象或类对象组成的元组
- 当第二个实参是类对象时,如果第一个实参是第二个实参的实例对象或其子类的实例对象,则返回TURE
- 第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象或其子类的实例对象则返回TRUE
>>> isinstance(D(), D)
True
>>> isinstance(D(), B)
False
>>> isinstance(D(), A)
True
>>> isinstance(D(), (B,C))
False
>>> isinstance(D(), (A,B,C))
True
15. type()与dir()
1. type(): 用于获得指定对象的类型
- 实例对象的类型就是其对应的类对象
#实例对象的类型就是其对应的类对象
>>> class MyClass(object):
>>> pass
>>> mc = MyClass()
>>> print(type(mc))
<class '__main__.MyClass'>
- 类对象的类型是type,类对象是type的实例对象
#类对象的类型是type
>>> print(type(MyClass))
<class 'type'>
- 自定义函数的类型是function
#自定义函数的类型是function
>>> def do_sth():
>>> pass
>>> print(type(do_sth))
<class 'function'>
- 内置函数的类型是builtin_function_or_method
#内置函数的类型是builtin_function_or_method
>>> print(type(dir))
<class 'builtin_function_or_method'>
>>> print(type(dir()))
<class 'list'>
- 可以用==判断某个对象的类型是否为指定的类型(只适用于基本数据类型)
#可以用==判断某个对象的类型是指定的类型(只适用于基本数据类型)
>>> print(type(123) == int)
True
- 非基本数据类型需要使用标准库中的模块types中定义的变量判断其类型是否为指定类型
#非基本数据类型
>>> print(type(do_sth) == function) #报错
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-13-9963405ff686> in <module>()
26 #非基本数据类型
---> 27 print(type(do_sth) == function) #报错
NameError: name 'function' is not defined
>>> import types
>>> print(type(do_sth) == types.FunctionType)
True
2. dir()
- 对于制定的类对象或实例对象,可以调用内置函数dir()获得其所有可以访问的属性和方法(包括重父类中继承的)列表
- 类对象与实例对象的结果不同,类对象的结果中不包括实例属性
class MyClass(object):
#在类对象内部(方法外)绑定类属性
ca = 'ca'
#构造属性
def __init__(self):
# 在类对象内部绑定实例属性
self.ia = 'ia'
#定义实例方法
def im(self):
pass
#定义类方法
@classmethod
def cm(cls):
pass
#定义静态方法
@staticmethod
def sm():
pass
#类对象的结果中不包括实例属性
>>> print(dir(MyClass)) #没有实例属性ia
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'im', 'sm']
>>> print(dir(MyClass())) #有实例属性ia
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ca', 'cm', 'ia', 'im', 'sm']