zoukankan      html  css  js  c++  java
  • Python面向对象-获取对象信息type()、isinstance()、dir()

    type()

    type()函数用于判断对象类型:

    >>> type(11)
    <class 'int'>
    >>> type('abc')
    <class 'str'>
    >>> type(None)
    <class 'NoneType'>
    >>> type(abs)
    <class 'builtin_function_or_method'>
    >>> type(a)
    <class 'list'>

    type()返回的是对应class类型。下面是判断两个变量的type类型是否相同:

    >>> type(11) == type(22)
    True
    >>> type('abc') == str
    True
    >>> type('abc') == type(33)
    False

    如何判断一个对象是否是函数呢?使用types模块中定义的常量:

    >>> import types
    >>> def f():
    ...     pass
    ...
    >>> type(f)
    <class 'function'>
    >>> type(f) == types.FunctionType
    True
    >>> type(lambda x:x) == types.LambdaType
    True
    >>> type((x for x in range(10))) == types.GeneratorType
    True

    isinstance()

    如果存在以下继承关系:object->Animal->Dog->Husty

    那么,isinstance()可以告诉我们,一个对象是否是某种类型(续用上篇文章的例子):

    >>> class Husty(Dog):
    ...     pass
    ...
    >>> a = Animal()
    >>> b = Dog()
    >>> c = Husty()
    >>> isinstance(c,Husty)
    True
    >>> isinstance(c,Dog)
    True
    >>> isinstance(c,Animal)
    True
    >>> isinstance(b,Husty)
    False

    我们可以说Husty是Husty、Dog、Animal类型的对象,却不能说Dog是Husty的对象。应该不难理解吧。

    isinstance()同样可以用来判断基本数据类型,甚至可以判断一个变量是否是某些类型中的一种:

    >>> isinstance('abc',str)
    True
    >>> isinstance(22,int)
    True
    >>> isinstance([1,2,3,4],(list,tuple))
    True
    >>> isinstance((1,2,3,4),(list,tuple))
    True

    dir()

    用于获取一个对象的所有方法和属性。返回值是一个包含字符串的list:

    >>> dir('abc')
    ['__add__', '__class__',…… '__hash__', '__init__', '__i
    ……'isalnum
     'isidentifier', 'islower', …… 'translate', 'upper', 'zfill']

    其中,类似__xx__的属性和方法都是有特殊用途的。如果调用len()函数视图获取一个对象的长度,其实在len()函数内部会自动去调用该对象的__len__()方法,等价于:

    >>> len('abc')
    3
    >>> 'abc'.__len__()
    3

    据此,我们自己在定义类的时候,自己写一个__len__()方法,就可以使用len(实例变量)功能:

    >>> class MyObj(object):
    ...     def __len__(self):
    ...             return 55
    ...
    >>> obj = MyObj()
    >>> len(obj)
    55

    往往我们仅仅列出属性和方法还是不够的,配合getattr()、setattr()、hasattr(),我们可以直接操作一个对象的状态:

    >>> class MyObj(object):
    ...     def __init__(self):
    ...             self.x = 9
    ...     def power(self):
    ...             return self.x * self.x
    ...
    >>> obj = MyObj()
    >>> hasattr(obj,'x')
    True
    >>> obj.x
    9
    >>> hasattr(obj,'y')
    False
    >>> setattr(obj,'y',22)
    >>> hasattr(obj,'y')
    True
    >>> obj.y
    22
    >>> getattr(obj,'y')
    22

    还可以传入一个默认参数,如果属性不存在,返回默认值:

    >>> getattr(obj,'h','该页面不存在')
    '该页面不存在'

    再来演示如何获得对象的方法:

    >>> hasattr(obj,'power')
    True
    >>> f = getattr(obj,'power')
    >>> f
    <bound method MyObj.power of <__main__.MyObj object at 0x029FD250>>
    >>> f()
    81
  • 相关阅读:
    UVa 297 Quadtrees(树的递归)
    c++代码模板
    博客园 自定义CSS皮肤模板
    ubuntu 16.04 小键盘数字键盘开机自动启动
    set_union的几个例子
    CSU 1803 2016(数论)
    CSU 1809 Parenthesis(线段树+前缀和)
    UVA 253 Cube painting(暴力打表)
    洛谷 P1060 开心的金明
    Codeforces Round #369 (Div. 2) C. Coloring Trees(dp)
  • 原文地址:https://www.cnblogs.com/hiwuchong/p/8516772.html
Copyright © 2011-2022 走看看