python 之元类
定义类的两种方法:
1.class定义
2.type(类名,类的基类们,类的名称空间)
# 定义类的三要素:类名、基类、名称空间
class_name = 'Chinese'
class_bases = (object,)
class_body = """
country = 'China' def __init__(self,namem,age):
self.name=namem
self.age=age def talk(self):
print('%s is talking'%self.name) """
class_dic = {}
exec(class_body,globals(),class_dic)
print(class_dic) Chinese = type(class_name,class_bases,class_dic)
自定义元类控制类的创建(在元类的init方法里做控制):
class Mymeta(type):
'''
自定义的元类
'''
def __init__(self,class_name,class_bases,class_dic):
if not class_name.istitle():
raise TypeError('类名的首字母必须大写')
# 不写注释时,则无__doc__
if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
raise TypeError('必须有注释,且注释不能为空')
super(Mymeta,self).__init__(class_name,class_bases,class_dic) class Chinese(object,metaclass=type):
country = 'China'
def __init__(self, namem, age):
self.name = namem
self.age = age def talk(self):
print('%s is talking' % self.name) # Chinese首字母不大写的话会报异常
class Chinese1(object,metaclass=Mymeta):
'''
注释
'''
country = 'China'
def __init__(self, namem, age):
self.name = namem
self.age = age def talk(self):
print('%s is talking' % self.name) # Chinese2 = Mymeta(class_name,class_bases,class_dic)
自定义元类控制类的实例化(重写call方法):
class Mymeta(type):
def __init__(self,class_name,class_bases,class_dic):
if not class_name.istitle():
raise TypeError('类名的首字母必须大写')
# 不写注释时,则无__doc__
if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
raise TypeError('必须有注释,且注释不能为空')
super(Mymeta,self).__init__(class_name,class_bases,class_dic)
self.__instance = None
# 实现的单例可与sigleton装饰器的比较下
def __call__(self, *args, **kwargs):
if not self.__instance:
obj = object.__new__(self)
self.__init__(obj)
self.__instance = obj
return self.__instance class Mysql(object,metaclass=Mymeta):
'''
元类控制实例化行为
'''
def __init__(self):
self.host = '127.0.0.1'
self.port = 3306 def conn(self):
pass def execute(self):
pass obj1 = Mysql()
obj2 = Mysql()
print(obj1 == obj2)
python 之元类的更多相关文章
- python 通过元类控制类的创建
一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...
- Python 的元类设计起源自哪里?
一个元老级的 Python 核心开发者曾建议我们( 点击阅读),应该广泛学习其它编程语言的优秀特性,从而提升 Python 在相关领域的能力.在关于元编程方面,他的建议是学习 Hy 和 Ruby.但是 ...
- 关于python的元类
当你创建一个类时: class Foo(Bar): pass Python做了如下的操作: Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__ ...
- Python的元类
1.用元类验证子类 每当我们定义新类的时候,元类就会运行雅正代码,以确保这个新类符合规定的规范. Python系统把子类的class语句处理完毕,就会调用元类的 __new__ 方法.元类可以通过 _ ...
- 理解python的元类
看了一篇文档,借鉴一下!写下自己对python元类的理解,欢迎各位大神给出意见. 我的理解就是 type用来创建元类,元类用来创建类,类用来创建实例 这样一想,是不是可以认为元类创建类的过程等同于类创 ...
- 【转】Python 之 元类
原文链接: https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python http://python.jo ...
- Python中元类
元类(metaclass) 简单地说,元类就是一个能创建类的类,而类class 是由type创建的,class可以创建对象 type与object的关系详见:python中type和object 1. ...
- 转---一文读懂 python 的元类
译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...
- Python之元类详细解析
一.补充内置函数isinstance和issubclass 1.isinstance是判断一个对象是不是由一个对象产生的 class Foo: pass obj=Foo() print(isinsta ...
- Python之元类详解
一.引子 元类属于Python面向对象编程的深层魔法,99%的人都不得要领,一些自以为搞明白元类的人其实也是自圆其说,点到为止,从队元类的控制上来看就破绽百出,逻辑混乱: 二.什么是元类 一切源自于一 ...
随机推荐
- shell脚本分析mysql慢查询日志(slow log)
使用percona公司的pt-query-digest分析慢查询日志.分析.统计的结果的比較清晰 #!/bin/sh slowlog_path=/root/slow_query_log everysl ...
- idea 编辑yml文件没有联想功能,解决方案
idea 编辑yml文件没有联想功能,解决方案 https://segmentfault.com/q/1010000010556550 按Ctrl+Shift+Alt+S,点Facets如果没有添加s ...
- quick-cocos2d-x教程3:程序框架内文件夹分析之docs文件夹
如今我们分析框架中的docs文件夹.看看这个文档文件夹中,究竟放了那些对我们实用的东西. docs文件夹分析 UPGRADE_TO_2_2_3.md 就是讲升级的变化.详细说明:quick-cocos ...
- 九度OJ 1088:剩下的树 (线段树)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5791 解决:2649 题目描述: 有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点 ...
- gitlab 外网 无法访问 查端口 看文档
云服务器安装成功后 curl 页面可以正常跳转 重置密码的token 页面可以生成 但是 外网无法 访问 [root@test ~]# curl 127.0.0.1:18021 <htm ...
- java的多生产者多消费者例子
import java.util.concurrent.locks.*; public class Test9 { public static void main(String[] args) { / ...
- python网络爬虫之使用scrapy下载文件
前面介绍了ImagesPipeline用于下载图片,Scrapy还提供了FilesPipeline用与文件下载.和之前的ImagesPipeline一样,FilesPipeline使用时只需要通过it ...
- ios怎样在一个UIImageButton的里面加一些自己定义的箭头
能够採用例如以下方法,写一个函数: -(UIImage*) getOneImageButtonWithArrow{ //tmpView做附控件 UIView *tmpView = [[UIView a ...
- 《打造Facebook》
王淮的<打造Facebook>一书不厚,花半天时间轻松读完.书中没有大段的说教,只有近乎流水的陈述.正如作者所说,打造Facebook这本书由巴克伯格来写再合适不过.可惜他至少在近几年内没 ...
- 关于AngularJs中监听事件及脏循环的理解
可能很多刚入行或者刚学习的前端对于AngularJs中的一些事件或者概念感觉不理解或者没有思路,今天让我们一起来剖析一下AngularJs中的一些事件. AngularJs中对于的监听事件会用到一个s ...