参数化类与元类有什么区别(请给出Python代码示例)?
你好,Stack Overflow的朋友们,
我现在正在学习Python,还是个新手程序员。最近我发现了这个网站,它帮助我理解面向对象的编程思想。我知道元类是“类的类”(就像元目录是目录的目录一样),但我在理解一个问题上遇到了困难:根据网站的定义,元类和参数化类之间到底有什么实际的区别呢?
如果可以的话,请提供一些Python的代码示例,来说明这两者之间的不同。谢谢你的帮助!
2 个回答
17
Python没有“参数化类”,也不需要这种东西,所以在Python中很难给出相关的例子;-)。元类可以简单理解为“类的类”:通常情况下是type
(在Python 2中,只要你记得通过继承object
或其他内置类型来创建新式类,旧式类在Python 2中是个遗留产物,幸运的是在Python 3中已经消失,你最好就把它忘掉)。你可以创建一个自定义的元类(通常是继承type
),用于一些高级目的,但你几乎不需要这样做(尤其是考虑到自Python 2.6以来,很多以前需要自定义元类的功能,现在可以用类装饰器更简单地实现)。
对于任何类C,type(C)
就是它的元类。
参数化类是一个完全不同的概念。在Python中,最接近的实现可能是一个工厂函数,它根据传入的参数创建并返回一个类:
def silly(n):
class Silly(object):
buh = ' '.join(n * ['hello'])
return Silly
Silly1 = silly(1)
Silly2 = silly(2)
a = Silly1()
print(a.buh)
b = Silly2()
print(b.buh)
将会打印
hello
hello hello
再说一次,这绝对不是你会经常需要的东西——创建几个只在一个或几个参数上有所不同的类。无论如何,正如你所看到的,这与类的类(也就是元类)完全没有关系,在这个例子中,元类始终是type
(在我能想到的几乎所有更现实的例子中也是如此——我只是选择了一个简单的例子,在这个例子中,做这个的意义不太明显,而不是一个现实的、因此必然非常复杂的例子;-)。