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

内建函数 描      述
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 ...
时间: 2024-10-03 02:10:35

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

Python3 面向对象 高级编程

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.  class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 还可以尝试给实例绑定一个方法: >>> def set_age(self, age): # 定义一个函数作为实例方法 ...

python基础-面向对象高级编程

实例化对象绑定属性 s.name = 'Michael' # 动态给实例绑定一个属性 类绑定方法---所有实例化对象均可调用Student.set_score = set_score 实例化对象绑定方法---只有该对象可调用from types import MethodType#绑定方法需要使用MethodTypes.set_age = MethodType(set_age, s) # 给实例绑定一个方法 Python内置的@property装饰器就是负责把一个方法变成属性调用的把一个gett

C++面向对象高级编程(三)

版权声明:本文为博主原创文章,未经博主允许不得转载. 接下来的几篇文章,我将回忆一下C++的基础. C++的由两部分组成 1.C++语言 2.C++标准库 本篇文章主要分享我学习C++语言的笔记. 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主要围绕不带指针的class complex本节中主要围绕带指针的String类 前面我说过如果你创建的类不带有指针,那么多半你可以不用写析构函数,但是如果你创建了一个带指针的类,那么你必须重写Big Three 创建一个类

C++面向对象高级编程(二)

版权声明:本文为博主原创文章,未经博主允许不得转载. 接下来的几篇文章,我将回忆一下C++的基础. C++的由两部分组成 1.C++语言 2.C++标准库 本篇文章主要分享我学习C++语言的笔记. 这次主要回忆一下操作符重载. 先看一段代码,后续我会介绍这么做的原由 #include <iostream> class complex { public: complex(double r = 0, double i = 0) : re(r) ,im(i) {} complex& oper

[7]面向对象高级编程

[7]面向对象高级编程 数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念. 使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Student(object): ... pass ... 然后,尝试给实例绑定一个属性: >

Boolan C++面向对象高级编程学习第五周

本周C++面向对象高级编程编程主要是讲三个方面 1.虚表和虚指针 虚指针:如果类(包括父类)中有虚函数,就一定会有虚指针,虚指针是指向虚函数的虚表. 虚表:虚指针指向的一种类的表,表上存有类里面虚函数的实现的指针 这里虚函数和虚表一般是和类的多太性结合在一起来使用的,子类调用虚函数是通过调用虚指针来调用虚函数表里面的指针再来实现函数特性 这种调用的方式叫做动态绑定,是一种通过指针类型自动来判断调用的对象,在实现中可以不用区分哪个对象从而调用对应的函数 我们普通的调用类里面的函数叫做静态绑定 2.

C++面向对象高级编程(七)point-like classes和function-like classes

技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 /*简单实现一下智能指针的*与 -> 操作符*/ template <class T> class shared_ptr_test { public: T& operator* () const //重载* { return *px; } T* operator->() co

C++面向对象高级编程(九)Reference与重载operator new和operator delete

摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nullptr 2.引用之后不能再引用别人 3.引用通常不用于声明变量,多用于参数类型,和返回值类型 见下面代码 int main(int argc, const char * argv[]) { int x=0; //p is a pointer to x int* p = &x; // r is a

C++面向对象高级编程(六)转换函数与non-explicit one argument ctor

技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任意写转换函数 class Fraction { public: Fraction(int num, int den = 1):m_numerator(num),m_denominator(den){} operator double() const //注意看 没有返回类型,这个编译器会帮做,且防止