参数化类与元类有什么区别(请给出Python代码示例)?

9 投票
2 回答
7170 浏览
提问于 2025-04-16 02:52

你好,Stack Overflow的朋友们,

我现在正在学习Python,还是个新手程序员。最近我发现了这个网站,它帮助我理解面向对象的编程思想。我知道元类是“类的类”(就像元目录是目录的目录一样),但我在理解一个问题上遇到了困难:根据网站的定义,元类和参数化类之间到底有什么实际的区别呢?

如果可以的话,请提供一些Python的代码示例,来说明这两者之间的不同。谢谢你的帮助!

2 个回答

0

这个 文章 可能对你有帮助。而 这个 是个老文章,但也值得一读。我知道这并没有完全回答你的问题,但希望能给你一些启发。

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(在我能想到的几乎所有更现实的例子中也是如此——我只是选择了一个简单的例子,在这个例子中,做这个的意义不太明显,而不是一个现实的、因此必然非常复杂的例子;-)。

撰写回答