python 面向对象编程 之 元类
元类是类的类,使我们自定义的类,即我们用class定义类本质就是元类,是类的模板
四步走:
一:控制class定义类的过程
1.先拿到类名
2.在拿到基类
3.执行类体代码,得到名称空间的dict
4.调用元类将三个参数传递进去
#其实class 是上面四步的封装。(隔离了复杂度)
二:自定义元类
class Mymeta(type):
def __init__(self,class_name,class_base,class_dic):
super().__init__(class_name,class_base,class_dic)
class My(object,metaclass=Mymeta):
pass
三:控制类与对象的产生
class Bar:
def __call__(self, *args, **kwargs): print(self) print(args) print(kwargs)
bar = Bar()bar('test')#对象后面加括号触发
class Mymeta(type): def __init__(self, class_name, class_base, class_dic): ''' :param class_name: 类名 :param class_base: 基类 :param class_dic: 名称空间 ''' if not class_name.istitle(): raise ValueError('类名需要大小写')
if class_dic.get('__doc__'): content = class_dic.get('__doc__') content = content.replace(' ', '') content = content.replace('\n', '') if len(content)==0: raise ValueError('类不能没有注释') if '__doc__' not in class_dic or not clas_dic.get('__doc__').strip(): raise TypeError('必须为类指定文档注释')
super(Mymeta, self).__new__(class_name, class_name, class_dic)
class Mysql: ''' ''' def __init__(self, Host, Port): self.Host = Host self.Port = Port
#创建类的两种方式
方式一:、
使用class关键字
class People(object):
def talk(self):
print('你好')
def walk(self):
print('走路')
方式二:
手动模拟class创建类的过程:将创建类的步骤拆分来,手动去创建、
手动创建需要三个条件,
需要分别拿到
1.类名
2.类的父类
3.类体(执行后得到名称空间的dict)
class_name=People
class_base=object
class_body= ''' #类体
def talk(self):
print('你好')
def walk(self):
print('走路')
'''
cla=2wss_dic={}
步骤一(先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体代码
(exec产生名称空间的过程与真正的class过程类似,只是后者会将_开头的属性变形,生成类的局部名称空间,即填充字典)
exec(class_body,globals,class_dic)
步骤二:
People=type(class_name,class_base,class_dic)
#实例化type得到对象Foo,即我们得到对象People,即我们用class定义的类People
一个没有显示的声明自己的元类,默认继承的就是type
88
python 面向对象编程 之 元类的更多相关文章
- python 面向对象进阶之元类metaclass
一:知识储备 exec exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默认为local ...
- python高级编程之元类(第3部分结束)
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元编程 #new-style类带来了一种能力,通过2个特殊方法(_ ...
- Python面向对象篇之元类,附Django Model核心原理
关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一 ...
- 【转】python面向对象中的元类
type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hel ...
- python 面向对象十二 元类
一.类也是对象 只要使用关键字class,Python解释器在执行的时候就会创建一个对象.下面的代码段: class ObjectCreator(object): pass 将在内存中创建一个对象,名 ...
- Python:面向对象编程3 定制类(有更新)
Python:面向对象编程3 定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- 初学Python——面向对象编程
一.面向对象 or 面向过程? 编程范式: 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所 ...
- 神级程序员通过两句话带你完全掌握Python最难知识点——元类!
千万不要被所谓"元类是99%的python程序员不会用到的特性"这类的说辞吓住.因为 每个中国人,都是天生的元类使用者 学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生 ...
随机推荐
- node-sass:npm install node-sass --save
从git上拉下来的项目,要先安装依赖, 再运行. 缺少node-sass:npm install node-sass --save
- ArcGIS案例学习笔记-批处理擦除挖空挖除相减
ArcGIS案例学习笔记-批处理擦除挖空挖除相减 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:批处理擦除.挖空.挖除.相减 数据源:chp13/ex5/pa ...
- java axis2 webservice
http://clq9761.iteye.com/blog/976029/ 这篇文章写的是最全的,也是最好的.无须下一步下一步操作来操作去,写类直接调试,非常好!
- C# windows服务:通过cmd命令安装、卸载、启动和停止Windows Service(InstallUtil.exe)
步骤: 1.运行--〉cmd:打开cmd命令框 2.在命令行里定位到InstallUtil.exe所在的位置 InstallUtil.exe 默认的安装位置是在C:/Windows/Microsoft ...
- PowerDesigner 修改table背景色
Tools->Display Preferences(显示参数选择)->Format->Table->Modify->Fill->Fill color 出处:htt ...
- 定时删除文件夹"$1"下最后修改时间大于当前时间"$2"天的文件
shell 脚本: #!/bin/bash now=`date "+%Y-%m-%d_%H:%M:%S"` #获取当前时间 echo "当前时间: " ...
- win10 时间很烦
1.刷2次策略.2.打开控制面板-管理工具-服务里,有个windows time的服务,应该是正在运行,手动(触发),右键停止.3.win+r,regedit,打开注册表,找到HKEY_LOCAL_M ...
- vue 解决页面闪烁问题
watch: { //监听表格数据的变化[使用 watch+nextTick 可以完成页面数据监听的 不会出现闪烁] tableData: { //深度监听,可监听到对象.数组的变化 handler( ...
- Web前端js下载流文件
前端下载文件大概有以下种: 1)a标签链接下载 <a href="url">点击链接下载</a> 2)表单form提交下载 var form = $(&qu ...
- dns隧道 dns2tcpd
有些网络的防火墙设置只允许端口53的UDP流量,就不能通过tcp搭建隧道,这种情况下我们可以通过UDP搭建DNS隧道,通过搭建一个DNS服务器委派的子域,这个子域因为使我们自己搭建的主机,这时候就可以 ...