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 元类的使用相关推荐

  1. python元类使用场景_Python元类使用简介

    本文概述 Python中的元类是定义类行为方式的类的类.类本身就是元类的实例. Python中的类定义了该类实例的行为.为了更好地理解元类, 需要具有使用Python类的先验经验.在深入研究元类之前, ...

  2. python 元类 详解_Python 元类详解 __new__、__init__、__call__、__metacalss__

    了解元类之前,先了解几个魔术方法: __new__.__init__.__call__ __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪 ...

  3. python类的应用_Python · 元类(Meta Class)及其应用

    (这里是本章用到的 GitHub 地址)万物皆对象 -- Python 本章所介绍的元类(Meta Class)和之前介绍过的装饰器(Decorator)都是上面这句话的具现,其中装饰器告诉过我们&q ...

  4. python元类的使用_Python 元类使用讲解

    我要一大群的类都具有一种特点,我怎么给他们加上呢?模板嘛,我从这个模板创建一群类不就OK了?那就需要元类了. 定义一个元类(就是一个类的模板!莫多想,还要记住这是类级别的,不是对象级别的!): 代码如 ...

  5. python字典、列表、元祖使用场景_python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍...

    python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍 一丶元祖 1.元祖简介 元祖跟列表类似.只不过是有区别的. 如下: tuple(元祖英文) 跟列表类似, 元素不能 ...

  6. python计算复数的辐角_Python 自定义类中的函数和运算符重载

    如果你曾在字符串(str)对象上进行过 + 或 * 运算,你一定注意到它跟整数或浮点数对象的行为差异: >>> # 加法 >>> 1 + 2 3 >>& ...

  7. python中self做前缀_python 创建类和为什么类方法中self形参必不可少?

    我们观察到在类中定义方法时,都带有self形参,为何必须在方法中定义形参self呢? 因为Python调用方法创建类实例时,将自动传入实参self.每个与类相关联的方法调用都自动传递实参self,他是 ...

  8. python新式类c3算法_Python 新式类继承关系的 C3 算法(Python 2.3 的方法解析顺序,MRO)...

    Python 新式类继承关系的 C3 算法(Python 2.3 的方法解析顺序,MRO) 翻译:刘硕 摘要:本文档面向于想要了解Python 2.3版本中 C3 方法解析顺序的 Python程序开发 ...

  9. python中表示类的公有成员_Python面向对象 | 类的成员

    一. 细分类的组成成员 之前咱们讲过类大致分两块区域,静态字段部分和方法部分. 每个区域详细划分又可以分为: classA: company= '阿里巴巴' #静态变量(静态字段) __tel = ' ...

最新文章

  1. java读取属性文件的方法_java读取属性文件的方法
  2. 别魔改网络了,Google研究员:模型精度不高,是因为你的Resize方法不够好
  3. MySQL事务及字符集介绍
  4. UVA10375 POJ2613 ZOJ1863 Choose and divide【组合计算+迭代】
  5. 元素定位-XPATH定位方法总结
  6. 【Caffe安装】Ubuntu14.04上Caffe配置安装(Only CPU)
  7. 【转】匈牙利命名法则
  8. nginx 没有cookie_nginx实现负载均衡的原理及策略
  9. php汉字转拼音 字库型
  10. 计算机农林科学类sci期刊,农林科学类sci期刊有哪些
  11. win7托盘区没有蓝牙图标
  12. window的dos命令学习笔记 二
  13. MOSFET, MOS管, 开关管笔记
  14. eclipse里把Servers视图弄出来
  15. GEE(Google Earth Engine) 代码学习笔记一 快速入门
  16. Vue packages version mismatch解决方案
  17. 运维开发团队技能与效率提速利器:运维+低代码
  18. Docker的镜像制作与整套项目一键打包部署
  19. Office LTSC 2021离线安装ISO镜像
  20. Ubuntu18.04安装nvidia-docker(亲测有效,步骤详尽)

热门文章

  1. python树形结构显示_Python将字典转换成树状的层次结构,并在tkin中显示
  2. datatable转list方法(有借鉴到他人)
  3. DPDK examples rxtx_callbacks完全注释
  4. 依赖注入的三种方式_Spring IoC是如何进行依赖注入的
  5. python中浮点型占几个字节_Python基本数据类型
  6. python的OS库测试
  7. js触发button的点击事件
  8. nginx离线安装_做一个属于自己的离线下载服务器原来这么简单
  9. 服务器修改域,服务器修改域名
  10. oracle 11g 完美卸载,oracle 11g完美卸载