元类就是类的类,type就是Python中创建所有类的元类。type就是创建类对象的类。Python中所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,并且它们都是从一个类创建来,这个类就是type。
# class Foo(object):
# a = 100
# # 对于上面声明类的代码,实际上是由type帮助我们创建了类,具体可以理解为下面的过程
#
# # type(类名, 基类/父类元祖, 方法与类属性 字典) ——> 返回创建出来的类
# # Foo = type("Foo", (object,), {"a": 100})
#
# obj = Foo()
######################
# 使用type创建类
# 对象方法
def obj_fun(self):
print("obj_fun")
# 类方法
@classmethod
def class_fun(cls):
print("class_fun called")
# 静态方法
@staticmethod
def static_fun():
print("static fun called")
# 通过type创建一个类,然后找了一个变量bar来接收
bar = type("Foo", (object,), {"a": 100, "o_fun": obj_fun, "c_fun": class_fun, "s_fun": static_fun})
# print(bar.__name__)
obj = bar()
obj.o_fun()
# print(type(obj))
#
# print(bar.a)
bar.c_fun()
bar.s_fun()
# 用函数的语法自己定义了一个元类 upper_meta_class
def upper_meta_class(class_name, class_bases, class_attrs):
"""自己定义的元类"""
# class_name 用来接收类名 字符串
# class_bases 用来接收基类 元祖
# class_attrs 用来接收属性 字典 {"a":100, "b": 200}
new_class_attrs = {}
# 通过循环遍历class_attrs, 调整里面的键值对,放到new_class_attrs
for key, value in class_attrs.items():
new_class_attrs[key.upper()] = value
# new_class_attrs = {"A": 100, "B": 200}
return type(class_name, class_bases, new_class_attrs)
# 使用元类的方法
class Foo(object, metaclass=upper_meta_class):
a = 100
b = 200
# Foo = upper_meta_class("Foo", (object,), {"a":100, "b": 200})
# print(Foo.a)
print(Foo.A)
class upper_meta_class(type):
"""自定义元类"""
def __new__(cls, class_name, class_bases, class_attrs):
"""决定了对象的真实构造过程,对象是由new方法创造出来的"""
new_class_attrs = {}
# 通过循环遍历class_attrs, 调整里面的键值对,放到new_class_attrs
for key, value in class_attrs.items():
new_class_attrs[key.upper()] = value
# new_class_attrs = {"A": 100, "B": 200}
# return type(class_name, class_bases, new_class_attrs)
# 子类中调用父类的三种方法:
#1. return type.__new__(cls, class_name, class_bases, new_class_attrs)
#2. return super().__new__(cls, class_name, class_bases, new_class_attrs)
3. return super(upper_meta_class, cls).__new__(cls, class_name, class_bases, new_class_attrs)
# def __init__(self, class_name, class_bases, class_attrs):
# """初始化方法,对象已经存在,只是为对象进行属性设置"""
# python3 使用元类的方法
class Foo(object, metaclass=upper_meta_class):
a = 100
b = 200
#
# # python2 使用元类的方法
# class Foo(object):
# ___metaclass__ = upper_meta_class
# a = 100
# b = 200
# Foo = upper_meta_class("Foo", (object,), {"a":100, "b": 200})
# print(Foo.a)
print(Foo.A)
就是这样,除此之外,关于元类真的没有别的可说的了。但就元类本身,它们其实是很简单的:
- 拦截类的创建
- 修改类
- 返回修改之后的类究竟为什么要使用元类?
“元类就是深度的魔法,99%用户根本不必为此操⼼。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。 ——Python界的领袖 Tim Peters
元类及创建元类的方法(面试用相关推荐
- 设计一个雇员类,创建雇员类的对象数组并初始化,输出每个雇员的信息
设计一个雇员类,创建雇员类的对象数组并初始化,输出每个雇员的信息 class Employee { //雇员类private String id; //编号private String name; / ...
- 【Java入门学习】JAVA设计一个雇员类,创建雇员类对象
题目:设计一个雇员类,创建雇员类对象,统计雇员的出勤人数 1.属性包括:编号.姓名.年龄.职务.部门.出勤人数 2.方法包括:构造方法.输出信息的方法.签到方法 要求: 1.考虑属性和方法的访问权限 ...
- 【matlab】元胞数组(由元胞数组创建元胞数组)
元胞数组(由元胞数组创建元胞数组) 语法格式: 元胞数组名(指定索引)={元胞}: 我们来看一段代码:
- php创建一个类,JavaScript_创建一个类Person的简单实例,创建一个类Person,包含以下属 - phpStudy...
创建一个类Person的简单实例 创建一个类Person,包含以下属性:姓名(name).年龄(age).朋友(friends数组).问候(sayhi方法,输出问候语,例如:"你好!&quo ...
- MATLAB 基础知识 数据类型 元胞数组 创建元胞数组
本文说明如何使用 {} 运算符或 cell 函数创建元胞数组. 当要将数据放入一个元胞数组中时,请使用元胞数组构造运算符 {} 创建该数组. myCell = {1, 2, 3;'text', ran ...
- C++ 46.基于多态的职工管理系统(2)——创建职工类(创建职工抽象类、创建普通员工类、创建经理类、创建老板类)
创建职工类 1. 创建职工抽象类 职工的分类为:普通员工.经理.老板 将三种职工抽象到一个类(worker)中,利用多态管理不同职工种类 职工的属性为:职工编号.职工姓名.职工所在部门编号 职工的行为 ...
- python创建学生类和教师类_创建StudentServices类
跟着王进老师学开发Python系列课程: 课程从0开始,讲到人工智能:按阶段授课,从基础到跑路: 适合无基础的小白,也适合定制,需要哪个模块学哪个模块: 包含Python语法,Django,爬虫,My ...
- python定义一个矩形类_创建矩形类
你的class有一些问题.见以下评论class Rectangle: # Init function def __init__(self): # The only members are length ...
- Java设计一个雇员类,创建雇员类对象,统计雇员的出勤人数。
作者说: 实验用到了数组和循环,这个实验主要是练习构造方法和自定义方法,以及类的设计,属性等等. 一.实验要求 二.运行效果截图 三.代码示例 EmployLeetest类: public class ...
最新文章
- 马云:新一轮技术革命来袭,未来90%的制造业会在互联网上
- J2EE的13个规范总结
- iphone——日期处理
- Pandas - 查看DataFrame信息
- 如何在六个月或更短的时间内成为DevOps工程师(一)
- Android studio R文件丢失或错误解决方法
- 电脑usb安装win11失败,如何给电脑安装win11系统
- 嵌入式操作系统_一个C++版的嵌入式操作系统
- cocos2dx +vs2012安装教程
- Ubuntu16.04下安装QQ的完整操作记录(经验证可用)
- Kafka 的消息异常情况~追日
- Vue--Vuex--使用/教程/实例
- 直观理解语义分割中IOU
- python限制输入字数_iOS 限制输入字数完美解决方案
- 计算机基础为什么要学word,计算机基础中word教学探讨
- python中frame用法_Python实例之wxpython中Frame使用方法
- mysql占用cpu过高,问题解决
- 英文学习20180201
- DA14580BLE接收流程分析
- AI不思议|打Dota2和辩论都赢了,AI真的要超过人类?
热门文章
- iOStextField/textView在输入时限制emoji表情的输入
- Django之序列化
- 47.leetcode36_valid_suduko
- JS代码优化工具Prepack
- 完全理解Gson(1):简单入门
- const参数,const返回值与const函数
- A Way to implement Abstract Class In Flex
- Linux kernel 中模块化的平台驱动代码介绍
- 你想要的江湖,可能不在这时候笑傲
- python循环套循环_零基础学python 14 循环套循环:循环的嵌套