首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >旧式类、新式类和元类

旧式类、新式类和元类
EN

Stack Overflow用户
提问于 2012-05-08 16:02:31
回答 2查看 733关注 0票数 5

在Python2.x中,所有新样式的类都隐式或显式地继承自object。然后看看这个:

代码语言:javascript
复制
>>> class M(type):
...     pass
...
>>> class A:
...     __metaclass__ = M
...
>>> class B:
...     pass
...
>>> a = A()
>>> b = B()
代码语言:javascript
复制
>>> type(A)
<class '__main__.M'>
>>> type(a)
<class '__main__.A'>

这是否意味着A是一个新风格的类?但是A不是从object继承的,对吧?

代码语言:javascript
复制
>>> type(B)
<class 'classobj'>
>>> type(b)
<type 'instance'>

好的,B是一个经典的类,不是吗?

代码语言:javascript
复制
>>> isinstance(A, object)
True
>>> isinstance(B, object)
True

为什么objectA实例和B实例都是

如果Bobject的一个实例,那么type(B)就不是classobj,对吧?

EN

回答 2

Stack Overflow用户

发布于 2012-05-08 16:43:57

关于元类,你可以在这里阅读:http://docs.python.org/reference/datamodel.html#customizing-class-creation。一般来说,元类是用来处理新的样式类的。当你写的时候:

代码语言:javascript
复制
class M(type):
    pass

您可以使用:

代码语言:javascript
复制
class C:
    __metaclass__ = M

您将创建一个新的样式对象,因为M的定义方式(默认实现使用type创建一个新样式的类)。您可以始终实现自己的元类,它将使用types.ClassType创建旧式类。

票数 5
EN

Stack Overflow用户

发布于 2012-05-08 16:46:12

关于插槽,您可以在这里阅读http://docs.python.org/release/2.5.2/ref/slots.html,这是一个片段:

默认情况下,旧样式类和新样式类的实例都有一个字典用于属性存储。

对于新样式的类,您可以添加__slots__,然后将不会创建每个对象的字典。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10494853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档