博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Day 25 面向对象高阶
阅读量:5311 次
发布时间:2019-06-14

本文共 2008 字,大约阅读时间需要 6 分钟。

目录

面向对象高阶

isinstance 和issubclass

  • isinstance()

判断是否为实例化对象

isinstance中第一个参数为对象,第二个参数为类,isinstance不仅可以检测对象是否为类的实例化对象,同时如果第二个参数是实例化对象的类的父类时,返回结果也为True

isinstance和type的区别:

  1. isinstance:判断对象是否为这个类实例化出来的,或者这个类是否为实例化对象的父类.isinstance会检测父类
  2. type:获取实例化对象的类,通过==比较运算符进行判断,不会去检测父类
  • issubclass()

判断一个类是否为另一个类的子类,第一个参数是子类,第二个参数是父类

反射

反射就是通过字符串来操作类或者对象的属性

反射的本质就是在使用内置函数,其中反射有一下四个内置函数

  1. hasattr:判断一个方法是否存在这个类中
  2. getattr:根据字符串去获取对象里面对应的方法,加括号就可以执行
  3. setattr:通过setattr修改属性,或者添加到对象中
  4. delattr:删除

__call__

__call__方法是由对象加()或者类加()()触发的,call函数定义在类体代码中定义格式为

def __call__(self,*args,**kwargs):

​ print()

元类metaclass

什么是元类

元类就是负责制造类,也就是说元类是类的类

元类-->元类实例化-->类-->类实例化-->对象

使用/自定义元类的目的就是为了控制类产生的过程,还可以控制对象产生的过程

class创建类

如果说类也是对象,那么用class关键字的创建类的过程也是一个实例化的过程,该实例化的目的就是为了得到一个类,调用的是元类

用class关键字创建一个类,用的默认的元类type

# 类名 class_nameclass_name='Foo'# 类体代码 class_bodyclass_body='''count=0country='china'def __init__(self,name):    self.name=namedef f1(self):    print('f1 from Foo')'''# 父类 class_basesclass_bases=(object,)# exec方法(运行第一个参数的中的代码,把产生的名字丢入第三个参数字典中)class_dic=dict{}exec(class_body,{},class_dic)# 使用type生成类 type(类名,基类,类的名称空间)Foo=type(class_name,classs_bases,class_dic)
  • 分析用class自定义类运行原理(而非元类的运行原理)
  1. 拿到一个字符串格式的类名 class_name
  2. 拿到一个类的基类名 class_bases=(object,)
  3. 执行类体代码,拿到一个类的名称空间class_dic={...}
  4. 调用Foo=type(class_name,class_bases,class_dic)

自定义元类控制类的创建

class Mymeta(type):     #继承type类的类才能称之为元类    def __init__(self.class_name,class_bases,class_dic):        super().__init__(class_name,class_bases,class_dic)#使用父类type的功能,创建元类
  • 自定义元类控制类的产生过程,类的产生过程其实就是原理的调用过程
  • 我们可以在自定义元类的init方法中加入一些限制,来控制类的产生
class Mymeta(type):     #继承type类的类才能称之为元类    def __init__(self.class_name,class_bases,class_dic):        if not class_dict.get('__doc__'):            raise TypeError('类中必须有文档注释')        if not class_name.istitle():            raise TypeError('类名首字母必须大写')               super().__init__(class_name,class_bases,class_dic)#使用父类type的功能,创建元类

加上元类后类的属性查找顺序

对象本身-->类-->父类-->父类-->object-->元类(metaclass)-->type-->找不到就报错

转载于:https://www.cnblogs.com/masterjian924/p/11066684.html

你可能感兴趣的文章
【转】redo与undo
查看>>
解决升级系统导致的 curl: (48) An unknown option was passed in to libcurl
查看>>
Java Session 介绍;
查看>>
spoj TBATTLE 质因数分解+二分
查看>>
Django 模型层
查看>>
dedecms讲解-arc.listview.class.php分析,列表页展示
查看>>
Extjs6 经典版 combo下拉框数据的使用及动态传参
查看>>
【NodeJS】http-server.cmd
查看>>
研磨JavaScript系列(五):奇妙的对象
查看>>
面试题2
查看>>
selenium+java iframe定位
查看>>
P2P综述
查看>>
第五章 如何使用Burp Target
查看>>
Sprint阶段测试评分总结
查看>>
sqlite3经常使用命令&语法
查看>>
linux下编译openjdk8
查看>>
【python】--迭代器生成器装饰器
查看>>
Pow(x, n)
查看>>
安卓当中的线程和每秒刷一次
查看>>
每日一库:Modernizr.js,es5-shim.js,es5-safe.js
查看>>