zoukankan      html  css  js  c++  java
  • 面向对象高级编程——类、实例及其他对象的内建函数

    内建函数 描      述
    issubclass(sub,sup) 如果类sub是类sub的子类,则返回True,反之为False
    isinstance(obj1,obj2) 如果实例obj是类obj2或者obj2子类的一个实例,则返回True,反之为False
    hasattr(obj,attr) 如果obj有属性attr,则返回True
    getattr(obj,arrt[,default]) 返回对象obj的arrt属性,如果不存在,可以设置一个默认值,否则报错
    setattr(obj,attr,val) 设置obj的属性attr,替换任何已存在的属性值
    delattr(obj,attr) 从对象中删除属性
    dir(obj=None) 返回对象的属性的一个列表;如果没有给定obj,dir()则显示局部名称空间中的属性,也就是local().keys()
    super(type,obj=None)

    返回一个代表父类类型的代理对象;如果没有传入obj,则返回super对象是非绑定的,反之,如果obj是一个type,issubclass(obj,type)必为True,否则,isinstance(obj,type)就必为True。

    vars(obj=None) 返回obj的属性及其值的一个字典,如果没有给出obj,var()显示局部名称空间字典(属性及其值),也就是locals().

    首先给出一个类:

    >>> class Test(object):
    ...     first_eps = 123
    ...     def __init__(self,name,age):
    ...         self.name = name
    ...         self.age = age
    ...

    1.__dict__

    由一个字典组成,包含一个实例的所有属性。键是属性名,值是属性相应的数据值。也可以在查看类,不过没啥具体的意义。

    >>> t1 = Test('kebi',25)
    >>> Test.__dict__
    mappingproxy({'__module__': '__main__', 'first_eps': 123, '__init__': <function Test.__init__ at 0x0000026C0F2FBF28>, '__dict__': <attribute '__dict__' of 'Test' objects>, '__weakref__': <attribute '__weakref__' of 'Test' objects>, '__doc__': None})
    >>> t1.__dict__
    {'name': 'kebi', 'age': 25}  

    还存在一个__class__,没多大的作用。

    >>> t1.__class__
    <class '__main__.Test'>
    >>> Test.__class__
    <class 'type'>

    2.issubclass()和isinstance()

    issubclass():布尔函数判断一个类是另一个类的子类或者子孙类。

    >>> class A:
    ...     pass
    ...
    >>> class B:
    ...     pass
    >>> class C(B):
    ...     pass
    >>> b = B()
    
    >>> issubclass(C,B)
    True
    >>> issubclass(C,A)
    False
    >>> issubclass(b,B)  #不能用于判断一个对象是否是一个类的实例。
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: issubclass() arg 1 must be a class

    isinstance():布尔函数判断一个对象是否是另一个指定类的实例。

    >>> isinstance(b,B)
    True
    >>> isinstance(b,C)
    False
    >>> isinstance(C,B)   #不能用于判断子类和父类
    False

    3.hasattr()、getattr()、setattr()、delattr()

    hansattr()函数是布朗型,它的目的就是为了决定一个对象是否有一个特定的属性,一般用与访问某属性前实现做一下检查。

    getattr()函数获取相应的属性,可以设置不存在时的默认值。

    setattr()函数要么创建一个新的属性,要么取代一个已经存在的属性。

    delattr()函数会从一个对象中删除属性。

    >>> class Test(object):
    ...     first_express = 123
    ...     def __init__(self,name,age):
    ...         self.name = 'kebi'
    ...         self.age = 25
    ...     def print_att(self):
    ...         print('%s:%s'%(self.name,self.age))
    ...
    >>> t = Test('kebi',25)
    
    >>> getattr(t,'name')   #获取实例属性的值
    'kebi'
    >>> getattr(t,'age')
    25
    >>> hasattr(t,'age')   #查询实例的属性中是否存在age属性
    True
    >>> hasattr(t,'sex')
    False
    >>> setattr(t,'age',35)   #改age属性
    >>> getattr(t,'age')   #已经修改
    35
    >>> setattr(t,'sex','boy')   #添加属性,
    >>> getattr(t,'sex')
    'boy'
    >>> delattr(t,'sex')   #删除属性
    >>> getattr(t,'sex')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Test' object has no attribute 'sex'

    *attr()系列函数可以在各种对象下工作,不限于类(class)和实例(instance).

    4.dir()

    之前我们使用过用dir()列出一个模块的所有属性。

    >>> import math
    >>> dir(math)
    ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']

    dir()的功能远不如此。下面时python文档中的说法。

    dir()作用在实例上(经典类或新式类)时,显示实例的变量,还有在实例所在的类及所有它的基类中定义的方法和属性。

    >>> dir(t)
    ['__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__', 'age', 'first_express', 'name', 'print_att']

    dir()作用在类上时,则显示类以及它的所有基类的·__dict__中的内容。但它不会显示定义在元类中的属性

    >>> set(dir(t)) - set(dir(Test))
    {'age', 'name'}

    dir()作用在模块上时,则显示模块的__dict__的内容。

    >>> import math
    >>> dir(math)
    ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', '......

    dir()不带参数时,则显示调用者的局部变量。

    >>> dir()
    ['A', 'B', 'C', 'Test', 'Test_one', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'b', 't', 't1', 't2']

    5.super()

    super()这个函数可以帮我们找出类相应的父类,然后方便调用某些属性。

    6.vars()

    与dir()类似,返回一个字典,它包含了对象存储于其__dict__中的属性(键)和值。

    如果没有提供对象作为var()的参数,它将显示一个包含本地名称空间的属性极其值的字典。

    >>> t.__dict__
    {'name': 'kebi', 'age': 35}
    >>> vars(t)
    {'name': 'kebi', 'age': 35}
    >>> vars()
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module ...
  • 相关阅读:
    P1067 多项式输出(模拟水题)
    A. The Fair Nut and Elevator(暴力)
    A. The Fair Nut and Elevator(暴力)
    Knight Tournament (set)
    jquery怎么添加多个类名
    jquery对类的操作,添加,删除,点击添加,再点击删除
    jquery操作css样式的方法
    jquery浅复制和深复制区别
    TS 三种函数的定义方式
    ES7及ES8新特性
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7867258.html
Copyright © 2011-2022 走看看