Python3 元类编程

在Python中一切接对象,类也是一个对象,所有的类都是有type类创建,我们实际开发中最常用的type方法,是用来获取某个对象的类型的,例如type(1) ⇒ int 、type(‘str’) ⇒ str。但是type还有一种用法,就是用来创建类的。

1、通过type动态创建无父类、无属性的类
People = type('People', (), {})

p = People()
print(p)
2、通过type动态创建有父类、无属性的类
class Animal(object):
    name = '动物类'
    public = '类变量'
    def __init__(self, name):
        self.name = name
Dog = type('Dog', (Animal, ), {})

d = Dog('哈士奇')
print(d)
print(Dog.__bases__)
print(Dog.__mro__)
print(d.name)
print(d.public)
3、通过type动态创建有父类、有属性的类
class Animal(object):
    name = '动物类'
    public = '类变量'
    def __init__(self, name):
        self.name = name

Dog = type('Dog', (Animal, ), {'age': 2}) # 新增一个age属性
d = Dog('哈士奇')
print(d)
print(Dog.__bases__)
print(Dog.__mro__)
print(d.name)
print(d.public)
print(d.age)

值得注意的是:在类中方法也是一种属性,只不过该属性的值是函数地址而已,因此使用type创建类时,我们也可以创建类的一些方法。
例如:

# 通过type动态创建有类,添加类方法、静态方法、实例方法
@classmethod
def eat(cls):
    print('类方法')

@staticmethod
def say():
    print('静态方法')

def get_age(self):
    print('今年%d岁了' % self.age)


People = type('People', (), {'age': 2, 'eat': eat, 'say': say, 'get_age': get_age})
p = People()
People.eat()
p.eat()
p.say()
People.say()
p.get_age()
4、在编写类时,更改元类,使用自建的元类来创建类

__metaclass__属性,Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类,如果没有找到,就会用内建的type来创建这个类

def upper_attr(cls, bases, attrs):
    '''
    自定义元类,将所有的共有属性名都变成大写的属性名
    '''
    newAttr = {}
    for key, val in attrs.items():
        if not key.startswith('__'):
            newAttr[key.upper()] = val

    return type(cls, bases, newAttr)


class People(object, metaclass=upper_attr):
    name = 'asd'
    age = 18


p = People()
print(p.NAME) # p.name 会报属性找不到
print(p.AGE)

热门文章

暂无图片
编程学习 ·

Python使用Request库实现PC端学小易(适用app版本1.0.6)

Python使用Request库实现PC端学小易app(适用app版本1.0.6)前言抓包登录操作抓包搜题操作抓包数据分析登录搜题重点代码实现导入库tkinter实现简易图形界面部分request库实现登录部分搜题部分整理输出至tkinter部分完整代码重点 前言 一直以来学小易只有安卓段与IOS端的app,在…
暂无图片
编程学习 ·

leetcode718. 最长重复子数组/动态规划,滑动窗口

文章目录题目:leetcode718. 最长重复子数组/动态规划基本思想1:动态规划基本思想2:滑动窗口基本思想3:暴力 题目:leetcode718. 最长重复子数组/动态规划 给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。 示例 1: 输入: A: [1,2,3,2,1] B: [3,2,1…
暂无图片
编程学习 ·

Cause: org/gradle/api/internal/plugins/DefaultConvention

从spring下载了一个springboot初始化项目,gradle-wrapper.properties 中使用了 gradle 6.4(如下)distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip zipStoreBase=GRADL…
暂无图片
编程学习 ·

一线互联网大厂300多道Java面试题【全面解析】,助你备战“金九银十”、进军BAT、斩获offer必备的核心知识点

前言今年因为疫情原因,很多人在家里宅了很长一段时间,“金三银四”黄金季也随之而然的“泡汤”,所有的跳槽涨薪的黄金季都集中在了“金九银十”季,所以程序员的竞争会对比往年更加激烈,为了备战“金九银十”需要有充足的时间复习筹备,为面试做足准备。我这里这筹备了一份…
暂无图片
编程学习 ·

js队列实现优先级插入的方法

队列是先进先出.在医院中排队的时候就是一个队列,最先排队的人,会先获得医生的治疗,这就是先进先出的队列但是也有例外,当医院来了一位急救病人的时候,这个队列就需要做一些改进,改为最小优先队列,这样可以让急救病人首先获得医生的救治,从而保住性命.现在用js来实现一个优先队…
暂无图片
编程学习 ·

抓头,0xc00005错误看到一个比较多的解释 记录一下

说明文字:PAGE-FAULT-IN-NONPAGED-AREA 通常的原因:内存错误(数据不能使用分页文件交换到磁盘中). 解决方法:卸掉所有的新近安装的硬件. 运行由计算机制造商提供的所有系统诊断软件.尤其是内存检查. 检查是否正确安装了所有新硬件或软件,如果这是一次全新安装,请与硬件或软…
暂无图片
编程学习 ·

vue.js 介绍 (一)

Vue.js 是一个 JavaScript 的渐进式框架(可以由浅入深,由简单到复杂的使用。 Vue.js优点:体积小 33K 更高的运行效率 基于虚拟dom, 基于 js进行各种计算,把最终dom计算出来 双向数据绑定 生态丰富,学习成本低 大量基于 vue.js 的 ui框架,常用组件。如Element, IView。Vu…
暂无图片
编程学习 ·

2019ICPC南昌

2019ICPC南昌 重现C. And and Pair 题意: 给定一个很大的数n的二进制表示s(也就是01串),计算满足条件的数对<i,j>的数量 条件: 0<=j<=i<=n i&n=i i&j=0 其中&符号表示位运算与 答案对1e9+7取模 数据范围:|s|<=1e5 解法: 很容易看出可以用数…
暂无图片
编程学习 ·

关于this对象

this对象是是在运行时基于函数的执行环境绑定的 var object = {name: "My Object",getName: function(){return this.name; } } let b = object.getName; console.log(object.getName()); // "My Object" console.log(b()); // undefined 在全局函数中,…
暂无图片
编程学习 ·

[指南]-DeepFaceLab 2.0说明和教程(推荐)

DeepFaceLab 2.0指南/教程此教程机翻自:https://mrdeepfakes.com/forums/thread-guide-deepfacelab-2-0-explained-and-tutorials-recommended什么是DeepFaceLab 2.0?DeepFaceLab 2.0是利用机器学习来交换视频中人脸的工具/应用程序。1.0和2.0有什么区别?DFL 2.0有什么新功能…
暂无图片
编程学习 ·

驾考知识自查

驾考知识自查1事故的种类没有车辆追尾路段,只有事故多发路段2驾驶证 行驶证的换领驾驶证为核发地 行驶证为登记地3山坡挂挡问题p=fv 机动车功率一定 抵挡获得更大的牵引力,但不可以松开加速踏板,松开会导致遛坡4违规处罚问题饮酒后驾驶机动车的,处暂扣六个月机动车驾驶证,…
暂无图片
编程学习 ·

在ckplayer实现把视频进度添加到数据库中

var videoObject = { container: ‘.videosamplex’,//“#”代表容器的ID,“.”或“”代表容器的class variable: ‘player’,//该属性必需设置,值等于下面的new chplayer()的对象 autoplay:true,//自动播放 loaded:‘loadHandler’, video: list_url,//视频地址 }; if(cooki…
暂无图片
编程学习 ·

java编程思想——抽象类和接口的详解(实例)

文章目录一、抽象类的概念和作用1.抽象的定义2.抽象类3.抽象方法的特点4.抽象类的特点抽象类和接口为什么不能被实例化的原因二、理解抽象类和接口java类为什么是单继承?参考资料: 一、抽象类的概念和作用 1.抽象的定义 抽象是把多个事物的共性的内容抽取出来,本质就是把我们…
暂无图片
编程学习 ·

联想xiaoxin700-15isk黑苹果clover分享

首先声明,我也是第一次折腾黑苹果,经过多次摸索、谷歌、爬贴最终搞定适合自己的clover。本着分享的精神,提供我的clover供大家多一个选择。假如,这个clover并不适合你请见谅。电脑详细配置和黑果小兵维护机型那里给的是一样的。https://github.com/athlonreg/Lenovo-XiaoXi…
暂无图片
编程学习 ·

城轨交通系统中智能化管理的作用分析

3D可视化集成系统是根据虚拟现实技术的情景在软件系统中,展现数据信息,把平时的软件业务流程在虚拟场景中完成。计划方案可运用于地铁站、轻轨站、单轨、有轨电车、磁浮等这种轨道交通系统的管理方法上。 轨道交通系统中,地铁已经中国成为大城市标准配置的交通工具,到目前为…
暂无图片
编程学习 ·

Codeforces Round #654 (Div. 2) D. Grid-00100(构造)

题目链接 思路:题目要求价值最小,怎么放价值最小?每次放的地方行和列最大值最小值之差为1,那么当行或者列%n==0时就从头开始此时的行列最大值最小值之差依旧是1 #include <cstdio> #include <cstring> #include <algorithm> #include <set> #inclu…