python元类使用场景_python 元类的使用
class Animal(object):
"""a class representing an animal"""
def __init__(self,name):
self.name = name
def eat(self):
pass
def go_to_vet(self):
pass
animal = Animal('cat')
print(type(Animal))
print(animal)
#用type方式创建类******************************************************************
def init(self,name):
self.name = name
def eat(self):
pass
def go_to_vet(self):
pass
Animal = type('Animal',(object,),
{'__doc__':"a class representing an animal",'__init__':init,
'eat':eat,'go_to_vet':go_to_vet})
animal = Animal('dog')
print(animal)
#创建子类
def meow(self):
return None
def purr(self):
return None
Cat = type('Cat',(Animal,),{
'meow':meow,
'purr':purr
})
cat = Cat(name='xiaohuang')
print(cat)
print(type(Cat))
#元类示例******************************************************************
class Meta(type):
"""a metaclass that adds no actual functionality"""
def _(cls,name,bases,attrs):
"""
:param name: 类型:字符串 类名
:param bases: 类型:元组,继承的基类
:param attrs: 类型:字典 属性
:return: 类
"""
return super(Meta, cls).__new__(cls,name,bases,attrs)
#何时使用元类******************************************************************
# 1.说明性类声明,现有示例django模型声明
# 2.类验证 (foo 和 bar属性两个只能包含一个)
class FooOrbar(type):
def __new__(cls, name,bases,attrs):
if 'foo' in attrs and 'bar' in attrs:
raise TypeError('Class %s cannot contain both foo and bar'%name)
if 'foo' not in attrs and 'bar' not in attrs:
raise TypeError('Class %s must provide either foo or bar'%name)
return super(FooOrbar,cls).__new__(cls,name,bases,attrs)
class Valid(metaclass=FooOrbar):
foo = 42
v = Valid()
class Invalid(metaclass=FooOrbar):
foo =41
# 以上实现存在一个问题,他的子类并不会继承该功能,原因是元类直接检查attrs属性,但这只包含所声明的类属性集,
# 他并不知道继承自基类的属性
# class AlsoValid(Valid):
# pass
# 改进如下
class FooOrBarUpdate(type):
def __new__(cls, name,bases,attrs):
"""实例化,从基类中获取了所有的属性"""
answer = super(FooOrBarUpdate, cls).__new__(cls,name,bases,attrs)
if hasattr(answer,'foo') and hasattr(answer,'bar'):
raise TypeError('Class %s cannot contain both foo and bar'%name)
if not hasattr(answer,'foo') and not hasattr(answer,'bar'):
raise TypeError('Class %s must provide either foo or bar' % name)
return answer
# 3.非继承性
class Meta1(type):
def __new__(cls, name,bases,attrs):
if attrs.get('abstract',False):
return super(Meta1,cls).__new__(cls,name,bases,attrs)
class SubClass(metaclass=Meta1):
abstract = False
# 以上元类定义存在一个问题,任何子类都需要显示的声明自己并不是抽象类
# 改进如下 :
class MetaUpdate1(type):
def __new__(cls, name,bases,attrs):
if attrs.pop('abstract',False):
return super(MetaUpdate1, cls).__new__(cls,name,bases,attrs)
#meta-coding***************************************************************
class Logged(type):
""""a meta class that cause classes that it creates to log their function calls"""
def __new__(cls, name,bases,attrs):
for k,v in attrs.items():
if callable(v):
attrs[k] = cls.log_call(v)
return super(Logged, cls).__new__(cls,name,bases,attrs)
@staticmethod
def log_call(v):
def inner(*args,**kwargs):
try:
response = v(*args,**kwargs)
print('%s函数被调用,参数为%s,字典关键字为:%s.'%(v.__name__,args,kwargs))
return response
except Exception as e:
print('%s函数被调用,抛出异常:%s'%(v.__name__,e))
raise e
return inner
class MyClass(metaclass=Logged):
def foo(self):
pass
def bar(self):
raise TypeError('oh,noes')
obj = MyClass()
obj.foo()
obj.bar()
python元类使用场景_python 元类的使用相关推荐
- python元类使用场景_Python元类使用简介
本文概述 Python中的元类是定义类行为方式的类的类.类本身就是元类的实例. Python中的类定义了该类实例的行为.为了更好地理解元类, 需要具有使用Python类的先验经验.在深入研究元类之前, ...
- python 元类 详解_Python 元类详解 __new__、__init__、__call__、__metacalss__
了解元类之前,先了解几个魔术方法: __new__.__init__.__call__ __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪 ...
- python类的应用_Python · 元类(Meta Class)及其应用
(这里是本章用到的 GitHub 地址)万物皆对象 -- Python 本章所介绍的元类(Meta Class)和之前介绍过的装饰器(Decorator)都是上面这句话的具现,其中装饰器告诉过我们&q ...
- python元类的使用_Python 元类使用讲解
我要一大群的类都具有一种特点,我怎么给他们加上呢?模板嘛,我从这个模板创建一群类不就OK了?那就需要元类了. 定义一个元类(就是一个类的模板!莫多想,还要记住这是类级别的,不是对象级别的!): 代码如 ...
- python字典、列表、元祖使用场景_python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍...
python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍 一丶元祖 1.元祖简介 元祖跟列表类似.只不过是有区别的. 如下: tuple(元祖英文) 跟列表类似, 元素不能 ...
- python计算复数的辐角_Python 自定义类中的函数和运算符重载
如果你曾在字符串(str)对象上进行过 + 或 * 运算,你一定注意到它跟整数或浮点数对象的行为差异: >>> # 加法 >>> 1 + 2 3 >>& ...
- python中self做前缀_python 创建类和为什么类方法中self形参必不可少?
我们观察到在类中定义方法时,都带有self形参,为何必须在方法中定义形参self呢? 因为Python调用方法创建类实例时,将自动传入实参self.每个与类相关联的方法调用都自动传递实参self,他是 ...
- python新式类c3算法_Python 新式类继承关系的 C3 算法(Python 2.3 的方法解析顺序,MRO)...
Python 新式类继承关系的 C3 算法(Python 2.3 的方法解析顺序,MRO) 翻译:刘硕 摘要:本文档面向于想要了解Python 2.3版本中 C3 方法解析顺序的 Python程序开发 ...
- python中表示类的公有成员_Python面向对象 | 类的成员
一. 细分类的组成成员 之前咱们讲过类大致分两块区域,静态字段部分和方法部分. 每个区域详细划分又可以分为: classA: company= '阿里巴巴' #静态变量(静态字段) __tel = ' ...
最新文章
- java读取属性文件的方法_java读取属性文件的方法
- 别魔改网络了,Google研究员:模型精度不高,是因为你的Resize方法不够好
- MySQL事务及字符集介绍
- UVA10375 POJ2613 ZOJ1863 Choose and divide【组合计算+迭代】
- 元素定位-XPATH定位方法总结
- 【Caffe安装】Ubuntu14.04上Caffe配置安装(Only CPU)
- 【转】匈牙利命名法则
- nginx 没有cookie_nginx实现负载均衡的原理及策略
- php汉字转拼音 字库型
- 计算机农林科学类sci期刊,农林科学类sci期刊有哪些
- win7托盘区没有蓝牙图标
- window的dos命令学习笔记 二
- MOSFET, MOS管, 开关管笔记
- eclipse里把Servers视图弄出来
- GEE(Google Earth Engine) 代码学习笔记一 快速入门
- Vue packages version mismatch解决方案
- 运维开发团队技能与效率提速利器:运维+低代码
- Docker的镜像制作与整套项目一键打包部署
- Office LTSC 2021离线安装ISO镜像
- Ubuntu18.04安装nvidia-docker(亲测有效,步骤详尽)
热门文章
- python树形结构显示_Python将字典转换成树状的层次结构,并在tkin中显示
- datatable转list方法(有借鉴到他人)
- DPDK examples rxtx_callbacks完全注释
- 依赖注入的三种方式_Spring IoC是如何进行依赖注入的
- python中浮点型占几个字节_Python基本数据类型
- python的OS库测试
- js触发button的点击事件
- nginx离线安装_做一个属于自己的离线下载服务器原来这么简单
- 服务器修改域,服务器修改域名
- oracle 11g 完美卸载,oracle 11g完美卸载