【python深入】获取对象类型及属性
在python中,查看当前的对象所能够调用的所有方法?
查看类型可以通过type,也可以通过isinstance方法,查看属性可以通过dir()
下面是对type的介绍:
————》基本类型的判断可以通过type来实现:
>>> type(123)
<class \'int\'>
>>> type(\'a\')
<class \'str\'>
>>> type([])
<class \'list\'>
>>> type({})
<class \'dict\'>
>>> a = (1,2,3)
>>> type(a)
<class \'tuple\'>
>>> type(None)
<class \'NoneType\'>
>>> type(type(a))
<class \'type\'>
可以通过import types,在2.X中可以通过types.ListType来判断是否等于List的Type,可以查看:
>>> import types
>>> types.ListType
<type \'list\'>
>>> dir(types)
[\'BooleanType\', \'BufferType\', \'BuiltinFunctionType\', \'BuiltinMethodType\', \'ClassType\', \'CodeType\', \'
ComplexType\', \'DictProxyType\', \'DictType\', \'DictionaryType\', \'EllipsisType\', \'FileType\', \'FloatType\'
, \'FrameType\', \'FunctionType\', \'GeneratorType\', \'GetSetDescriptorType\', \'InstanceType\', \'IntType\', \'
LambdaType\', \'ListType\', \'LongType\', \'MemberDescriptorType\', \'MethodType\', \'ModuleType\', \'NoneType\',
\'NotImplementedType\', \'ObjectType\', \'SliceType\', \'StringType\', \'StringTypes\', \'TracebackType\', \'Tup
leType\', \'TypeType\', \'UnboundMethodType\', \'UnicodeType\', \'XRangeType\', \'__all__\', \'__builtins__\', \'_
_doc__\', \'__file__\', \'__name__\', \'__package__\']
可以通过下面语句来判断某个对象的类型是否属于某个基础类型:
>>> type(\'a\')==types.StringType
True
但是在3.X中可以看到ListType、StringType等的已经去掉了
>>> import types
>>> dir(types)
[\'AsyncGeneratorType\', \'BuiltinFunctionType\', \'BuiltinMethodType\', \'CodeType\', \'CoroutineType\', \'DynamicClassAttribute\', \'FrameType\', \'FunctionType\', \'GeneratorType\', \'GetSetDescriptorType\', \'LambdaType\', \'MappingProxyType\', \'MemberDescriptorType\', \'MethodType\', \'ModuleType\', \'SimpleNamespace\', \'TracebackType\', \'_GeneratorWrapper\', \'__all__\', \'__builtins__\', \'__cached__\', \'__doc__\', \'__file__\', \'__loader__\', \'__name__\', \'__package__\', \'__spec__\', \'_ag\', \'_calculate_meta\', \'_collections_abc\', \'_functools\', \'coroutine\', \'new_class\', \'prepare_class\']
也可以通过isinstance():在对类的继承关系的判定上是支持的,并且也能够支持基本类型的判定(且在2.X和3.X中均适用,测试用的是Python27和36)
>>> isinstance([], list)
True
>>> isinstance({}, dict)
True
>>> isinstance((), tuple)
True
>>> isinstance(1, int)
True
>>> isinstance(1, long)
False
>>> isinstance(111111111, long)
False
>>> a = test() #其中test为之前定义的一个类
>>> isinstance(a, object)
True
>>> isinstance(a, test2)
False
>>> isinstance(u\'123\', str)
False
>>> isinstance(\'123\', str)
True
>>> isinstance(u\'123\', unicode)
True
下面是dir的使用:
例如下方class的定义中,直接dir(类名)则不包含对象所具备的属性value,初始化一个对象a之后,则dir(a)中就包含了value的属性
>>> class test4():
def __init__(self):
self.value = 1
>>> dir(test4)
[\'__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__\']
>>> a = test4()
>>> dir(a)
[\'__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__\', \'value\']
那么如何为类定义一个属性呢?可以直接类似下方这样定义,这样类和对象的属性就都有value这一项
>>> class test5():
value = 1
def __init__(self):
pass
def getvalue(self):
print (value)
>>> dir(test5)
[\'__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__\', \'getvalue\', \'value\']
>>> b = test5()
>>> dir(b)
[\'__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__\', \'getvalue\', \'value\']
定义的时候 不用self,但是在方法中调用的时候可以用self,也可以不用self,如下:
>>> class test6():
value = 1
def __init__(self):
pass
def getvalue(self):
print (self.value)
>>> dir(test6)
[\'__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__\', \'getvalue\', \'value\']
>>> c = test6()
>>> dir(c)
[\'__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__\', \'getvalue\', \'value\']
什么是属性?属性包括变量和方法~~~
参考: