首页 > 其他分享 >认识metaclass

认识metaclass

时间:2023-12-14 22:44:37浏览次数:32  
标签:__ name 认识 type Foo metaclass class

python的一切皆对象,没错类也是对象

>>> class Foo():
...     pass
...
>>>
>>> Foo.name = "Fo"

我们通过class关键字来定义一个类,我们也可以对这个类进行添加属性,添加方法等各种对象操作。

那么类是由谁创建的呢?

>>> class Foo():
...     pass
...
>>> type(Foo)
<class 'type'>

type可以用来动态创建类

>>> myclass = type("myClass",(), {"name":"obj"})
>>> myclass
<class '__main__.myClass'>
>>> obj = myclass()
>>> obj.name
'obj'

在python3中,我们可以显式的指定metaclass,如果未指定,那么就会默认使用type来创建

还记得python双下划线的私有方法么

比如

class Foo():
    def __foo__():
        pass

我们实例化 Foo().__foo__()会发生什么? 解释器会找不到该方法,实际方法名已经被修改成了 _Foo__foo__

怎么做到修改呢?正好metaclass可以实现这一特性

class UpperAttrMetaClass(type):

    def __new__(mcs, class_name, bases, attr):
        upper_attr = {
            item if item.startswith("__") else item.upper(): v for item, v in attr.items()
        }
        return type(class_name, bases, upper_attr)


class Foo(object, metaclass=UpperAttrMetaClass):

    def __init__(self):
        self.name = "Foo"

    def __protected_fun(self) -> str:
        return self.name


if __name__ == '__main__':
   print(dir(Foo))


>>>['_FOO__PROTECTED_FUN', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

metaclass在实际场景的应用是啥?

很可惜,除了ORM这种复杂场景,我们基本使用不到

Metaclasses are deeper magic that 99% of users should never worry about it. If you wonder whether you need them, you don't (the people who actually need them know with certainty that they need them, and don't need an explanation about why).

 

标签:__,name,认识,type,Foo,metaclass,class
From: https://www.cnblogs.com/xu-xiaofeng/p/17902346.html

相关文章

  • 算法中的复杂度认识O(logn)
    今天在看到O(logn)的时候,先去看了下什么是对数,有一个博主说的特别好,经过勤奋的工作之后,已经忘记了什么是对数。参考百度百科的对数公式:对数公式是数学中的一种常见公式,如果ax=N(a>0,且a≠1),则x叫做以a为底N的对数,记做x=logaN,其中a要写于log右下。其中a叫做对数的底,N叫做真数。通......
  • 今天在地铁认识一个女程序员,在外包公司工作三年被裁,只赔偿 4000...
    来源:https://www.163.com/dy/article/G9K7V11T05373SPQ.html今天在地铁认识一个女(硕士),我邀请她来我公司面试,她要求15000一个月,听她说被外包公司骗了,合同都是套路,被裁员后只获得4000元的赔偿,就这个举动,我感觉她是一个职场小白,我看她学历这么高就给了一次机会她。她自我介绍说:学......
  • 认识HTTP协议与apache
    万维网:(www)并非计算机网络,而是一个大型的数据库,可以实现网页与网页之间的跳转url:资源定位符描述了一个资源在服务器上的具体位置http:超文本传输协议图片视频小程序http:HyperTextTransferProtocol应用层协议,默认端口:80/tcp可以使用http协议的软件apachenginx......
  • 快速认识什么是:Kubernetes
    每次谈到容器的时候,除了Docker之外,都会说起Kubernetes,那么什么是Kubernetes呢?今天就来一起学快速入门一下Kubernetes吧!希望本文对您有所帮助。Kubernetes,一种用于管理和自动化云中容器化工作负载的工具。想象一下你有一个管弦乐队,将每个音乐家视为一个码头容器。为了创作优......
  • 快速认识什么是:Docker
    Docker,一种可以将软件打包到容器中并在任何环境中可靠运行的工具。但什么是容器以及为什么需要容器呢?今天就来一起学快速入门一下Docker吧!希望本文对您有所帮助。假设您使用Cobol构建了一个在某种奇怪风格的Linux上运行的应用程序。您想与您的朋友分享这个应用程序,但他有一个......
  • [Re221127周任务]认识寄存器
    1.分析逻辑 我们一个一个点进去看 我们这里是加密过程并且加密后直接与输入对比的,所以我们可以直接动调2.动调 下在这里就好了 点进去eax就有flag了 注意这个flag是不包括上面那个1的 ......
  • 大语言模型底层架构丨带你认识Transformer
    本文分享自华为云社区《大语言模型底层架构你了解多少?大语言模型底层架构之一Transfomer的介绍和python代码实现》,作者:码上开花_Lancer。语言模型目标是建模自然语言的概率分布,在自然语言处理研究中具有重要的作用,是自然语言处理基础任务之一。大量的研究从n元语言模型(n-gram......
  • 学习Vue3 第六章(认识Ref全家桶)
    ref接受一个内部值并返回一个响应式且可变的ref对象。ref对象仅有一个 .value property,指向该内部值<template><div><button@click="changeMsg">change</button><div>{{message}}</div></div></template><......
  • (万字长文)手把手教你认识学会LangChain
    什么LangChainLangChain:一个让你的LLM变得更强大的开源框架LangChain六大主要领域管理和优化prompt。不同的任务使用不同prompt,如何去管理和优化这些prompt是langchain的主要功能之一。链,初步理解为一个具体任务中不同子任务之间的一个调用。数据增强的生成,数据增强生成涉及特定类......
  • Homebrew学习(一)之初认识
    Homebrew学习(一)之初认识 HomebrewHomebrew是一款MacOS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,会自动下载相关依赖,十分方便便捷(缺失包管理器)Homebrew能干什么?......