关于python的元组类型,python友元类
什么是元类?
在了解元类之前,我们先来了解一下Python中的OOP和Class。
面向对象s全称是面向对象编程(OOP)的简称,这种编程思想是众所周知的。它以对象为程序的基本单位,将数据和功能封装在其中,能够实现良好的可重用性、灵活性和可扩展性。OOP中有两个基本概念:类和对象:
类是描述如何创建对象的代码段。它用于描述具有相同属性和方法的对象集合。它定义集合中每个对象共享的属性和方法。
对象是一个类的实例。
让我们举个例子:
In:classObjectCreator(对象):
.通行证
.
In:my_object=ObjectCreator()
In:my_object
Out : _ _ main _ _。ObjectCreatorat0x1082bef0和Python中的类不限于此:
In:print(对象创建者)
类“_ _ main _ _”。对象创建者对象创建者可以是print,所以它的类也是一个对象!因为类是对象,所以您可以动态地创建它们,就像创建任何对象一样。我需要在日常模拟中动态创建类。例如,在模拟数据时,现在有一个接收参数的函数func:
In:deffunc(实例):
.print(实例a,实例b)
. print(instance . method _ a(10))
.3360.传入的实例在正常使用时符合要求(有属性A和B,有method_a),但当我想单独调试func时,需要“构建”一个。如果我不用元类,我应该这样写3360。
In:defgenerate_cls(a,b):
.classFake(object):
.defmethod_a(self,n):
.returnn
.假的
.假的
. return false
.
In:ins=generate_cls(1,2)()
In:ins.a,ins.b,ins.method_a(10)
Out:(1,2,10)你会发现这不算“动态创作”:
类名(Fake)不方便改变
要创建的类需要的属性和方法越多,就需要相应的加码,这是不灵活的。
我通常做什么:
In:defmethod_a(self,n):
.returnn
.
In:ins=type(Fake ,(),{a:1, b:2, method_a:method_a})()
In:ins.a,ins.b,ins.method_a(10)
Out:(1,2,10)在这里,引出了type函数。它最初用于让您了解对象的类型:
In:type类型(1)
Out:int
In:type类型( 1 )
Out:str
In:type类型(对象创建者)
Out:type类型
In:type(ObjectCreator())
Out:__main__。ObjectCreator另外,如上所述,type还可以动态创建类:type可以将类的描述作为参数,返回一个类。
用来创建类的是“元类”
MyClass=type(MyClass ,(),{})这种用法是因为type实际上是一个元类。作为一个元类,type在Python中用来在后台创建所有的类。Python里有句话叫“一切都是对象”。包、字符串、函数和类.所有这些都是对象。所有这些都由一个类创建:
In:age年龄=35
In:age。__class__
Out:int
In:name=bob
In:name。__class__
Out:str
.现在,任何__class__中的具体__class__是什么?
In:age。__class__。__class__
Out:type类型
In:name。__class__。__class__
Out:type类型
.如果你愿意,你可以称类型为“类工厂”。Type是Python中内置的元类。当然,你也可以创建自己的元类。
创建自己的元类
2当Python2创建一个类时,可以添加一个__元类_ _属性:
classFoo(object):
__元类_ _=某物.
[.]如果这样做,Python将使用元类创建Foo类。Python将在类定义中寻找__元类_ _。如果找到它,Python将使用它来创建对象类Foo。如果没有找到,Python将使用type创建这个类。
在Python3中,语法发生了变化:
classSimple1(object,元类=something.):
[.]本质上是一样的。举一个4年前编写和分享的元类的例子(只是推荐你去阅读它
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。