参数化类和元类有啥区别(请使用 Python 中的代码示例)?

Posted

技术标签:

【中文标题】参数化类和元类有啥区别(请使用 Python 中的代码示例)?【英文标题】:What is the difference between a parameterized class and a metaclass (code examples in Python please)?参数化类和元类有什么区别(请使用 Python 中的代码示例)? 【发布时间】:2011-03-30 14:09:16 【问题描述】:

您好 Stack Overflow 贡献者,

我是一名正在学习 Python 的新手程序员,我偶然发现了 this site,它有助于解释面向对象的范例。我知道元类是类的类(例如元目录如何成为目录的目录等),但我遇到了一些问题:元类和参数化类之间的实际区别是什么,根据网站的定义?

如果可以,请提供 Python 代码示例来说明两者之间的差异。感谢您的帮助!

【问题讨论】:

this site 不再存在。 【参考方案1】:

Python 没有(或不需要)“参数化类”,因此很难在 Python 中提供它们的示例;-)。元类只是“类的类”:通常是type(只要在 Py2 中,你记得通过继承 object 或其他一些内置类型或其他新的-style 类——旧式类是 Py2 中的遗留产物,幸运的是在 Py3 中消失了,理想情况下你应该忘记它们)。您可以为几个高级目的创建一个自定义元类(通常是子类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

再次重申,这绝对不是您经常需要的——创建几个仅因一个或几个参数而不同的类。无论如何,正如你所看到的,它与类的类(AKA 元类)完全无关,在这个例子中它总是type(在我能想到的几乎所有更现实的例子中——我只是选择给出一个简单的例子,这样做的意义很难辨别,而不是一个现实的,因此必然非常复杂的例子;-)。

【讨论】:

几天前我切换到Py3,想既然我现在只是个学生,我应该学习明天的“时髦新事物”。猜猜这是一个聪明的举动:-)【参考方案2】:

这个write up 可能会有所帮助。 this one 是老歌,但也值得一读。我知道这并不能完全回答你的问题,但我希望它能让你深思。

【讨论】:

以上是关于参数化类和元类有啥区别(请使用 Python 中的代码示例)?的主要内容,如果未能解决你的问题,请参考以下文章

python 类和元类(metaclass)的理解和简单运用

在 Groovy 中,实例的元类与其类的元类有啥区别

Scala中的final类和sealed类有啥区别?

旧式类、新式类和元类

在类似 django 的表单实现中使用元类有啥好处?

抽象类和静态类有啥区别?