首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我更喜欢元类而不是继承Python中的超类

在Python中,元类(metaclass)是一种特殊的类,用于创建其他类。它可以被视为类的模板或者类的类。而超类(superclass)则是指一个类继承的父类。

我更喜欢元类而不是继承Python中的超类的原因有以下几点:

  1. 动态创建类:元类允许我们在运行时动态地创建类,而不需要预先定义类的结构。这使得我们可以根据需要灵活地创建不同的类,满足特定的需求。
  2. 控制类的行为:通过使用元类,我们可以对类的行为进行更精确的控制。我们可以在元类中定义特定的方法和属性,这些方法和属性将自动应用到由该元类创建的所有类中。这样,我们可以实现一些通用的功能,例如自动添加日志、验证属性等。
  3. 避免继承的限制:继承是一种静态的关系,它在类定义时就已经确定了。而元类可以在运行时动态地创建类,不受继承关系的限制。这使得我们可以更灵活地组织和管理代码,避免过度的继承层次。
  4. 提供更高级的抽象:元类可以为我们提供更高级的抽象,使得代码更易于理解和维护。通过定义适合领域特定语言(DSL)的元类,我们可以使用更自然和直观的语法来描述问题,提高代码的可读性和可维护性。

总结起来,元类相比于继承超类具有更大的灵活性和控制力。它允许我们动态创建类、控制类的行为、避免继承的限制,并提供更高级的抽象。这使得元类成为一种强大的工具,可以帮助我们更好地组织和管理代码,提高开发效率。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数(Serverless):https://cloud.tencent.com/product/scf
  • 腾讯云容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云安全产品:https://cloud.tencent.com/solution/security
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送):https://cloud.tencent.com/product/umeng
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云虚拟专用网络(VPC):https://cloud.tencent.com/product/vpc
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

流畅 Python 第二版(GPT 重译)(七)

这对我们目的可能已经足够了。这就是为什么喜欢说协议是一种“非正式接口”。这也是 Smalltalk 对协议理解方式,这是第一个使用该术语面向对象编程环境。...有类型 double 函数 当向习惯于静态类型语言程序员介绍 Python 时,喜欢一个例子就是这个简单double函数: >>> def double(x): ......,将示例 3-9 StrKeyDict重写为子类化dict不是UserDict。...偏向对象组合不是继承 这个小节标题是《设计模式》书中面向对象设计第二原则¹²,也是在这里能提供最好建议。一旦你熟悉了继承,就很容易过度使用它。...在同样结论,Hynek Schlawack 写道:“不要忘记,更多时候,一个函数就是你所需要。”同意,这正是为什么继承之前,《Fluent Python》深入讲解函数原因。

9810

深入理解Python(metaclass)

知道,根据传入参数不同,同一个函数拥有两种完全不同用法是一件很傻事情,但这在Python是为了保持向后兼容性) type可以像这样工作: # type(名, 父元组(针对继承情况,可以为空...type就是Python在背后用来创建所有。现在你想知道那为什么type会全部采用小写形式不是Type呢?...如果你喜欢的话,可以把称为“工厂”(不要和工厂搞混了:D) type就是Python内建元,当然了,你也可以创建自己。...但就本身而言,它们其实是很简单: 1)   拦截创建 2)   修改 3)   返回修改之后 五、为什么要用metaclass不是函数?...就算通常你可以把所有的东西都在__new__里处理掉,有些人还是觉得用__init__舒服些。 5) 哇哦,这东西名字是metaclass,肯定非善类,要小心! 究竟为什么要使用

40640

Python 实现动态工厂模式

前言 本文讨论主要是,如何把工厂模式生产产品,即抽象子类信息动态地保存到一个表不是直接简单粗暴地使用 if-else 来判断。...装饰器 这里不是介绍装饰器,只是通过装饰器形式来保存子类信息。这里省略了 Parser 其它方法,只保留抽象方法。... ,原! 这里有一个坑,就是 ParserMeta 需要继承自 abc.ABCMeta,因为 Parser 是继承自 abc.ABC 抽象,下文有详细解释。...具体分析如下:首先,本质是默认创建时候会调用 type,指定后就调用指定那个。...但是,由于 Python 不存在 interface 这个概念,实际上这个 Parser 中方法也不是太多,如果硬要使用依赖注入反而会让代码复杂,所以最终就没用。

32820

流畅 Python 第二版(GPT 重译)(十三)

② 当定义当前子类时,会调用__init_subclass__。它将新子类作为第一个参数传递进来,这就是为什么将参数命名为subclass不是通常cls。...选择装饰器不是简单 __init_subclass__ 最常见原因可能是为了避免干扰其他特性,如继承。...Movie 声明方式:它使用 @checked 装饰不是继承 Checked。...提示 在编写时,发现采用这种特殊方法参数命名约定很有用: 对于实例方法,使用 cls 不是 self,因为实例是一个。...在 Python 和 SQL 喜欢用空字符串代替None或NULL来表示缺失数据。学习 Go 强化了这个想法:在 Go ,原始类型变量和结构字段默认初始化为“零值”。

8310

pythontype和object详解

Bases类似于面向对象语言中“基”,“”。  如果你想知道一个对象在内存位置,你可以调用id(对象)来查看。在这里,再次强调,在python,一切都有对象概念。...__class__和type()输出是一样。  在旧版本python是特指用class语句创造出来东西。内置类型例如int一般不会被认为是,而是被认为是类型。...Q:实例化时候要指定类型,但是当继承python如何知道用哪个类型?  它查看你继承,并且使用类型来作为新对象类型。 ...A:能,这就得出场了,通过属性__metaclass__你可以重新创造一个类型出来。这里简单列一个例子。的话下面会简单介绍。 ...准备结束  一幅描绘python对象图  我们最后得到一幅由不同对象组成地图:  在大多数情况之下,我们都是学习第二列和第三列内容。至于第一列,那是领域了。不是所有人都要深入学习。

70120

每天一道 python 面试题 - Python(metaclass) 详细版本

type是Python用于在幕后创建所有。 现在,您想知道为什么用小写不是小写Type? 好吧,想这与str创建字符串对象int和创建整数对象一致性有关。...请注意,该metaclass属性将不会被继承父(Bar.class)将被继承。如果Bar使用通过(不是)metaclass创建属性,则子类将不会继承该行为。...确实,对于做黑魔法特别有用,因此也很复杂。但就其本身而言,它们很简单: 拦截class创建 修改class 返回修改后 为什么要使用不是函数?...即使通常您可以全部new使用它,有些人也习惯使用init。 这些被称为,该死!它一定意味着什么! 为什么要使用? 现在是个大问题。为什么要使用一些晦涩易错功能?...type实际上是它自己。这不是您可以在纯Python复制东西,而是通过在实现级别上作弊来完成。 其次,很复杂。您可能不希望将它们用于非常简单更改。

57200

pythontype和object详解

Bases类似于面向对象语言中“基”,“”。 如果你想知道一个对象在内存位置,你可以调用id(对象)来查看。在这里,再次强调,在python,一切都有对象概念。...可能会觉得有点乱,稍微总结一下:数字2是类型int(一般来讲,在python”和“类型”是同一种东西)一个实例。倒过来说,int是数字2类型。...__class__和type()输出是一样。 在旧版本python是特指用class语句创造出来东西。内置类型例如int一般不会被认为是,而是被认为是类型。...觉得有必要为这个改变定义一条规则: 是类型,类型也是(Class is Type is Class) 在>=2.3版本python和类型是同一样东西。...Q:实例化时候要指定类型,但是当继承python如何知道用哪个类型? 它查看你继承,并且使用类型来作为新对象类型。

48610

每天一道 python 面试题 - Python(metaclass) 详细版本

type是Python用于在幕后创建所有。 现在,您想知道为什么用小写不是小写Type? 好吧,想这与str创建字符串对象int和创建整数对象一致性有关。...请注意,该__metaclass__属性将不会被继承父(Bar.__class__)将被继承。如果Bar使用通过(不是)__metaclass__创建属性,则子类将不会继承该行为。...确实,对于做黑魔法特别有用,因此也很复杂。但就其本身而言,它们很简单: 拦截class创建 修改class 返回修改后 为什么要使用不是函数?...即使通常您可以全部__new__使用它,有些人也习惯使用__init__。 这些被称为,该死!它一定意味着什么! 为什么要使用? 现在是个大问题。为什么要使用一些晦涩易错功能?...type实际上是它自己。这不是您可以在纯Python复制东西,而是通过在实现级别上作弊来完成。 其次,很复杂。您可能不希望将它们用于非常简单更改。

40210

python高级】认识和基础用法

那些实际⽤到⼈都⾮常 清楚地知道他们需要做什么,⽽且根本不需要解释为什么要⽤。“ ——蒂姆·彼得斯TimPeters 什么是python,所有的,都是基于创建。...用来创建,叫做,函数type实际上也是一个python任何形式以及python3任何都是type一个实例。...深入一下 经过上面的例子我们知道了,object是所有type是创建,那么如果把基修改了,是不是创建出来就是自动继承所修改后?...定义一个 声明一个,并继承自type。 在定义__new__方法,该方法用于创建新。 在__new__方法可以自定义行为、属性和方法。...,就是一个普通,可我不是type了,而是自定义 想不到吧,才是基 123 如果我们没有指定为自定义,输出将会没有想不到吧那一行。

14120

流畅python读书笔记-第十章-继

__mro__) 直接调用 d.pong() 运行是 B 版本。 Python 能区分 d.pong() 调用是哪个方法,是因为 Python 会按照特定顺序遍历继承图。...通过继承重用代码是实 现细节,通常可以换用组合和委托模式。接口继承则是框架支柱。 02. 使用抽象基显式表示接口 现代 Python ,如果类作用是定义接口,应该明确把它定义为抽象基。...Python 3.4 及以上版本,我们要创建 abc.ABC 或其他抽象基子类 python没有interface这种定义 03....在名称明确指明混入 因为在 Python 没有把声明为混入正规方式,所以强烈推荐在名称中加入...Mixin 后缀。...“优先使用对象组合,不是继承” 这句话引自《设计模式:可复用面向对象软件基础》一书, 这是能提供最佳 建议。 熟悉继承之后,就太容易过度使用它了。

35910

Pythontype和classobj

,一查才知道Python2定义分为两种,经典(也就是报错中提到classobj)和新式Pythonsuper只能应用于新式不能应用于经典。...而在Python3,所有都默认继承自object,也就是说Python3全部都是新式,没有经典,所以也就不会报错。进一步思考,为啥报错中提到must be type?...难道不是应该是object类型吗,object和type又是什么关系?先放结论:object是所有type是什么呢?...对于所有object,它是被定义,但这个也是对象,它类型就是type,如果了解Python中元编程大概就能明白这句话意思了,这里简单说一下大概:因为Python是动态语言,所以创建也是在程序运行过程创建...显式继承自object,都是由type创建,都是type类型,至于object,它是Python中所有

9410

探寻Python鼻祖——

2个参数,元组是父名字,不是字符串 添加属性是 类属性,并不是实例属性 5....到底什么是(终于到主题了) 就是用来创建【东西】。你创建就是为了创建实例对象,不是吗?但是我们已经学习到了Python也是对象。...type 就是 Python在背后用来创建所有。现在你想知道那为什么 type 会全部采用小写形式不是 Type 呢?...好吧,猜这是为了和 str 保持一致性,str是用来创建字符串对象 int 是用来创建整数对象。type 就是创建对象。你可以通过检查 __class__ 属性来看到这一点。...但就本身而言,它们其实是很简单: 拦截创建 修改 返回修改之后 究竟为什么要使用? 现在回到我们大主题上来,究竟是为什么你会去使用这样一种容易出错且晦涩特性?

90300

探寻Python鼻祖——

2个参数,元组是父名字,不是字符串 添加属性是 类属性,并不是实例属性 5....到底什么是(终于到主题了) 就是用来创建【东西】。你创建就是为了创建实例对象,不是吗?但是我们已经学习到了Python也是对象。...type 就是 Python在背后用来创建所有。现在你想知道那为什么 type 会全部采用小写形式不是 Type 呢?...好吧,猜这是为了和 str 保持一致性,str是用来创建字符串对象 int 是用来创建整数对象。type 就是创建对象。你可以通过检查 __class__ 属性来看到这一点。...但就本身而言,它们其实是很简单: 拦截创建 修改 返回修改之后 究竟为什么要使用? 现在回到我们大主题上来,究竟是为什么你会去使用这样一种容易出错且晦涩特性?

80210

Julia推出新机器学习框架MLJ,号称超越机器学习pipeline

使模型实现能够正确地考虑训练中看到不是评估 团队还计划在不久将来继续增强特性,包括Flux.jl深度学习模型集成,以及使用自动微分连续参数梯度下降调整。...为什么要选择MLJ不是ScikitLearn.jl scikit-learn是一个非常强大机器学习Python库,基本包含了所有机器学习方式,涵盖了数据预处理到训练模型各个方面,可以极大节省代码量...Julia已经有了一个很棒机器学习工具箱ScitkitLearn.jl,为Julia用户提供了对成熟且庞大机器学习模型库访问,那为什么要抛弃ScitkitLearn.jl用MLJ呢?...MLJ纯 ScitkitLearn.jl最初是用作流行python库scikit-learnJulia包装器,对要求性能例程又封装了C代码元算法仍然是python代码,纯度太低,MLJ则完全用Julia...模型数据注册表 在ScikitLearn.jl,必须从文档收集可用模型列表,以及模型数据(模型是否处理分类输入,是否可以进行概率预测等)。

1.4K20

为什么在 20 多年后,仍然爱着 PHP 和 JavaScript

即便这样,也依然很喜欢用 PHP 和 JavaScript 来编程。 1 Python 很好,但 PHP 确实容易使用 PHP 诞生于上世纪九十年代中期,岁数甚至比很多程序员还大。...而且虽然生命周期更长,但 Python 一直没能达到 PHP 目前高度。 为什么会这样? 从个人观点出发,觉得跟 PHP 相比,Python 使用起来要麻烦。...多年发展让它们和自己生态一同成长 PHP 8 可不是你太奶奶用过 PHP3, ECMAScript 12 也不是你太爷爷写过 JavaScript。...当年就是一路从复制粘贴基础代码段一路成长到用 PHP2 和 PHP3 写出完全属于我自己网站,现在也能够用积累经验回报社群,帮助那些刚入门初学者们,这一点让感到非常自豪。...没有什么能阻挡你写出好代码 无论是 PHP、JavaScript 还是 Perl,这些语言都提供了函数、变量、、头等函数等行之有效工具,有的还额外提供了 trait 和原型式继承

58820

Python和新型-对象是实例,那又是谁实例?

事实上绝大部分情况下都都不是必须使用才能完成开发,但是动态地生成能力能方便地解决下面情景难题: 在设计时不是所有细节都能确定,有些细节需要程序运行时得到信息才能决定。...要实现AOP所说自动调用,有的语言使用AspectJ编译器,Python则使用。 小结 ---- 具有动态改变能力,给编程带来了方便动态性和能力。...新型VS传统 ---- 老版本Python不是所有的元素都是对象,内置数值类型都不能被继承,而在版本2.2后,任何内建类型也都是继承自object,凡是继承object或者object...子类都是新型不是继承自object或object子类都成为传统。...例如可以定制实例化过程,尤其时在多重继承情况下能避免传统存在缺陷。事实上Python3.X版本已经不存在传统了,目前传统存在意义主要是为了保持之前兼容性。

1K10

Python学习之魔法方法

Python3.0没有"旧式",也不需要侠士子类化Object或者将设置为type(代码起始行__metaclass__=type).那是因为所有的都是隐式成为Object子类。...此时我们就可以在子类重写函数以满足自己需求。...重写一般方法和特殊构造方法:  了解过继承概念后我们知道,每个都可能拥有一个或者多个,子类从父那里继承一些行为方式。不仅如此,我们也可以重写一些方法来自定义继承行为。...再看父定义eat函数,启动eat函数需要设置hungry属性。但不解是,我们已经继承了鸟Bird,Bird里也定义了hungry为什么不起作用呢。...,调用函数返回对象任何方法都是调用方法。

46520

什么是metaclass?

此文为原译,如需转载,请联系作者 简书地址::nummy 即对象 在理解元之前,需要先掌握PythonPython概念与SmallTalk概念相似。...注意:__metaclass__属性不会被子类继承,但是父__class__会被继承。 自定义 主要作用是在创建时候自动改变。...__new__(cls, clsname, bases, uppercase_attr) 实际上做了以下三方面的工作: 干涉创建过程 修改 返回修改之后 为什么使用不是函数来定义?...理由如下: 目的明确,当你阅读UpperAttrMetaclass(type)时候,你知道它用来做什么。 可以使用面向对象编程,可以继承自其它,还可以覆盖父方法。...这是因为models.Model使用了,它会将Python定义字段转换成数据库字段。 通过使用,Django将复杂接口转换成简单接口。

37520

Python 到底是什么?这篇恐怕是最清楚

type是 Python 用于在幕后创建所有。 现在,您想知道为什么用小写不是小写Type? 好吧,想这与str创建字符串对象int和创建整数对象一致性有关。...type只是创建对象。 您可以通过检查__class__属性来看到。 一切,意思是一切,都是 Python 对象。其中包括整数,字符串,函数和。它们都是对象。...请注意,该__metaclass__属性将不会被继承,父(Bar.__class__)将被继承。如果Bar使用通过(不是)__metaclass__创建属性,则子类将不会继承该行为。...Python 3 设置语法在 Python 3 已更改: class Foo(object, metaclass=something): ......为什么要使用? 现在是个大问题。为什么要使用一些晦涩易错功能? 好吧,通常您不会: 是更深层魔术,99%用户永远不必担心。

67920
领券