元类就是类的类,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)
 
就是这样,除此之外,关于元类真的没有别的可说的了。但就元类本身,它们其实是很简单的:
  1. 拦截类的创建
  2. 修改类
  3. 返回修改之后的类究竟为什么要使元类?
“元类就是深度的魔法,99%用户根本不必为此操⼼。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。    ——Python界的领袖    Tim    Peters

元类及创建元类的方法(面试用相关推荐

  1. 设计一个雇员类,创建雇员类的对象数组并初始化,输出每个雇员的信息

    设计一个雇员类,创建雇员类的对象数组并初始化,输出每个雇员的信息 class Employee { //雇员类private String id; //编号private String name; / ...

  2. 【Java入门学习】JAVA设计一个雇员类,创建雇员类对象

    题目:设计一个雇员类,创建雇员类对象,统计雇员的出勤人数 1.属性包括:编号.姓名.年龄.职务.部门.出勤人数 2.方法包括:构造方法.输出信息的方法.签到方法 要求: 1.考虑属性和方法的访问权限 ...

  3. 【matlab】元胞数组(由元胞数组创建元胞数组)

    元胞数组(由元胞数组创建元胞数组) 语法格式: 元胞数组名(指定索引)={元胞}: 我们来看一段代码:

  4. php创建一个类,JavaScript_创建一个类Person的简单实例,创建一个类Person,包含以下属 - phpStudy...

    创建一个类Person的简单实例 创建一个类Person,包含以下属性:姓名(name).年龄(age).朋友(friends数组).问候(sayhi方法,输出问候语,例如:"你好!&quo ...

  5. MATLAB 基础知识 数据类型 元胞数组 创建元胞数组

    本文说明如何使用 {} 运算符或 cell 函数创建元胞数组. 当要将数据放入一个元胞数组中时,请使用元胞数组构造运算符 {} 创建该数组. myCell = {1, 2, 3;'text', ran ...

  6. C++ 46.基于多态的职工管理系统(2)——创建职工类(创建职工抽象类、创建普通员工类、创建经理类、创建老板类)

    创建职工类 1. 创建职工抽象类 职工的分类为:普通员工.经理.老板 将三种职工抽象到一个类(worker)中,利用多态管理不同职工种类 职工的属性为:职工编号.职工姓名.职工所在部门编号 职工的行为 ...

  7. python创建学生类和教师类_创建StudentServices类

    跟着王进老师学开发Python系列课程: 课程从0开始,讲到人工智能:按阶段授课,从基础到跑路: 适合无基础的小白,也适合定制,需要哪个模块学哪个模块: 包含Python语法,Django,爬虫,My ...

  8. python定义一个矩形类_创建矩形类

    你的class有一些问题.见以下评论class Rectangle: # Init function def __init__(self): # The only members are length ...

  9. Java设计一个雇员类,创建雇员类对象,统计雇员的出勤人数。

    作者说: 实验用到了数组和循环,这个实验主要是练习构造方法和自定义方法,以及类的设计,属性等等. 一.实验要求 二.运行效果截图 三.代码示例 EmployLeetest类: public class ...

最新文章

  1. 马云:新一轮技术革命来袭,未来90%的制造业会在互联网上
  2. J2EE的13个规范总结
  3. iphone——日期处理
  4. Pandas - 查看DataFrame信息
  5. 如何在六个月或更短的时间内成为DevOps工程师(一)
  6. Android studio R文件丢失或错误解决方法
  7. 电脑usb安装win11失败,如何给电脑安装win11系统
  8. 嵌入式操作系统_一个C++版的嵌入式操作系统
  9. cocos2dx +vs2012安装教程
  10. Ubuntu16.04下安装QQ的完整操作记录(经验证可用)
  11. Kafka 的消息异常情况~追日
  12. Vue--Vuex--使用/教程/实例
  13. 直观理解语义分割中IOU
  14. python限制输入字数_iOS 限制输入字数完美解决方案
  15. 计算机基础为什么要学word,计算机基础中word教学探讨
  16. python中frame用法_Python实例之wxpython中Frame使用方法
  17. mysql占用cpu过高,问题解决
  18. 英文学习20180201
  19. DA14580BLE接收流程分析
  20. AI不思议|打Dota2和辩论都赢了,AI真的要超过人类?

热门文章

  1. iOStextField/textView在输入时限制emoji表情的输入
  2. Django之序列化
  3. 47.leetcode36_valid_suduko
  4. JS代码优化工具Prepack
  5. 完全理解Gson(1):简单入门
  6. const参数,const返回值与const函数
  7. A Way to implement Abstract Class In Flex
  8. Linux kernel 中模块化的平台驱动代码介绍
  9. 你想要的江湖,可能不在这时候笑傲
  10. python循环套循环_零基础学python 14 循环套循环:循环的嵌套