元类及创建元类的方法(面试用

元类就是类的类,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 第 33 场双周赛(511/3304,前15.5%,第4次全部通过)

文章目录1. 比赛结果2. 题目1. LeetCode 5479. 千位分隔数 easy2. LeetCode 5480. 可以到达所有点的最少点数目 medium3. LeetCode 5481. 得到目标数组的最少函数调用次数 medium4. LeetCode 5482. 二维网格图中探测环 hard1. 比赛结果 题目比较简单,全部做出来了。…

Oracle存储过程单步调试方法

oracle存储过程单步调试的方法 1.在要调试的过程上单击test,如下图所示: 2.出现如下界面时单击最左上方的按钮:,如下图所示: 3.单击后呈现如下画面: 其中: 表示要停止test; 表示要全部运行完这…

等价类、决策表测试

问题:输入年月日year、month、day,其中年份的有效取值范围为[1818,2018],请输出输入日期的前一天,例如输入2018年9月18日,输出为2018年9月17日。若输入日期非法,例如输入2013年2月30日,则输出“…

小大整数对象池及intern机制

1. 小整数对象池 Python 对⼩整数的定义是[-5, 256] 2. 大整数对象池 每⼀个⼤整数,均创建⼀个新的对象。 a 100 b 100 # print(a is b) True # 代码块 c 1000 d 1000 print(c is d) # True class Foo(object): a 1000 c 1000 class …

Apache Commons IO: 简化文件和IO操作

第1章:引言 咱们在做Java编程的时候,经常会遇到各种文件操作和输入输出(IO)的问题。不论是读取一个配置文件,还是把数据写入日志,这些看似简单的任务有时候会让人头疼。传统的Java IO操作,虽然…

LeetCode 1560. 圆形赛道上经过次数最多的扇区

文章目录1. 题目2. 解题2.1 模拟2.2 脑筋急转弯1. 题目 给你一个整数 n 和一个整数数组 rounds 。有一条圆形赛道由 n 个扇区组成,扇区编号从 1 到 n 。 现将在这条赛道上举办一场马拉松比赛,该马拉松全程由 m 个阶段组成。其中,第 i 个阶段…

如何用jar命令对java工程进行打包

如何用jar命令对java工程进行打包有时候为了更方便快捷的部署和执行Java程序,要把java应用程序打包成一个jar包。而这个基础的操作有时候也很麻烦,为了方便java程序员们能够方便的打包java应用程序,下面对jar命令进行介绍,并举出几…

垃圾回收:引用计数与分代收集机制

当引⽤计数为0时,该对象⽣命就结束了。 引⽤计数机制的优点: 1、简单 2、实时性:⼀旦没有引⽤,内存就直接释放了。不⽤像其他机制等到特定时机。实时性还带来⼀个好处:处理回收内存的时间分摊到了平时。 引⽤计数机制的…

Android 行程APP简单介绍

登录模块 数据库设计如图所示创建了如上的数据库由于没有注册功能人为添加了两个用户: 数据库创建语句: public static final String CREATE_task "create table user (" "id integer primary key autoincrement, ""remenber…

python中主要内建函数

1.__getattribute__属性访问拦截器(内建属性 class Foo(object): def __init__(self): self.a 100 def __getattribute__(self, name): if name "a": # return self.a # __getattribute__("a") return super(Foo,self).__getattribute__(&qu…

LeetCode 1561. 你可以获得的最大硬币数目

文章目录1. 题目2. 解题1. 题目 有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币: 每一轮中,你将会选出 任意 3 堆硬币(不一定连续)。Alice 将会取走硬币数量最多的那一堆。你将会取走硬币数量第二多的那…

最近做项目的一些关于重构方面的总结

这半年做专题和项目的过程中,遇到一些有时很难想到问题,今天在这总结以下: 1. 关于width:100%缩小窗口时背景图片出现空白bug ,刚开始找了半天方法都没解决,最后在里面加了最小宽度给解决了, 例如&#xff…

微信小程序 地图组件使用

本地图程序利用map组件,以及使用它的markers,polyline属性分别设置地图两个位置的标志以及他们之间的连线,利用腾讯地图的API对两个地点进行查询,动态设置地图的经纬度,以及动态初始化markers,polyline属性。 程序运行截图如下&a…

python中的集合set

集合与之前列表、元组类似,可以存储多个数据,但是这些数据是不重复的 集合对象还⽀持union(联合), intersection(交), difference(差)和 sysmmetric_difference(对称差集)等数学运算. >>> x set(abcd) >>> x {c…

LeetCode 1562. 查找大小为 M 的最新分组

文章目录1. 题目2. 解题1. 题目 给你一个数组 arr ,该数组表示一个从 1 到 n 的数字排列。有一个长度为 n 的二进制字符串,该字符串上的所有位最初都设置为 0 。 在从 1 到 n 的每个步骤 i 中(假设二进制字符串和 arr 都是从 1 开始索引的情…

HDOJ 3415 Max Sum of Max-K-sub-sequence

单调队列优化。。。。Max Sum of Max-K-sub-sequenceTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4759 Accepted Submission(s): 1734Problem DescriptionGiven a circle sequence A[1],A[2],A[3]......A[n]…

DurOS语音开发

DuerOS语音开发项目,该项目通过搭载DuerOS开发者平台,利用平台开发的一组API规范,实现实时的语音播报功能。 整体流程示意图: 所用设备:树莓派微机系统、arduino与74HC595单片机、地图彩灯控制沙盘、小度语音。 数据流…

Sharepoint学习笔记—习题系列--70-573习题解析 -(Q40-Q44)

Question 40You need to send a single value from a consumer Web Part to a provider Web Part.Which interface should you use?A. IAlertNotifyHandlerB. IWebPartFieldC. IWebPartParametersD. IWebPartRow 解析:本题的目的是在Webpart之间传递“单值”(singl…

LeetCode 1563. 石子游戏 V(DP)

文章目录1. 题目2. 解题2.1 区间DP1. 题目 几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出。 游戏中的每一轮: Alice 会将这行石子分成两个 非空行(即,左侧行和右侧行…