码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象高级编程——类、实例及其他对象的内建函数

时间:2017-11-26 11:19:56      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:self   dexp   express   元类   ppi   att   替换   test   object   

 

内建函数 描      述
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 ...

 

面向对象高级编程——类、实例及其他对象的内建函数

标签:self   dexp   express   元类   ppi   att   替换   test   object   

原文地址:http://www.cnblogs.com/yangmingxianshen/p/7867258.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!