【发布时间】:2014-04-28 02:59:10
【问题描述】:
我不太明白基本元类是如何工作的(又名type)。有谁知道其功能的纯 python 类似物?
python 文档通常对难以用英语完整描述的 C 级代码执行此操作(例如,请参阅 the explaination of __getattribute__),但不适用于 type。
我知道如何开始。由于使用类型的子类定义type 的行为有点像说“类型的工作方式与类型的工作方式一样”,所以我定义了一个鸭子类型的元类。它有一些作用,但还不够。
class MetaClassDuck(object):
@classmethod
def __new__(self, mcs, name, bases, attrs):
"""Create a new class object."""
newcls = super(MetaClassDuck, self).__new__(mcs)
newcls.__dict__.update(attrs)
newcls.__name__ = name
newcls.__bases__ = bases
return newcls
def __call__(cls, *args, **kwargs):
"""Calling a class results in an object instance."""
###########################################################
# Fill in the blank:
# I don't see a way to implement this without type.__new__
###########################################################
return newobj
class MyClass(object):
__metaclass__ = MetaClassDuck
one = 1
_two = 2
@property
def two(self):
return self._two
# This bit works fine.
assert type(MyClass) is MetaClassDuck
assert MyClass.one == 1
assert isinstance(MyClass.two, property)
myobj = MyClass()
# I crash here:
assert myobj.one == 1
assert myobj.two == 2
class MyClass2(MyClass):
three = 3
assert type(MyClass2) is MetaClassDuck
assert MyClass2.one == 1
assert isinstance(MyClass2.two, property)
assert MyClass2.three == 3
myobj2 = MyClass2()
assert myobj2.one == 1
assert myobj2.two == 2
assert myobj2.three == 3
【问题讨论】:
-
你到底想要什么?如果您想了解
type的实际作用,最好的方法可能是阅读source code。如果你想在 Python 中实现自己的对象系统,尽可能少地使用内置特性,那么如果你对元类、特殊方法查找、描述符等进行了足够的阅读,这是可以实现的,但它不会与内置系统的互操作就像真正的类一样。如果你想让一些东西完全兼容像type(thing)这样的内置API... -
我不确定我是否理解您的问题。你想知道how metaclasses work吗?
-
您将不得不大量使用
type.__new__之类的东西,没有什么意义。 -
我试图通过在python中重新实现
type来澄清它的操作,如上面的__getattribute__example。不知道怎么说更清楚=/ -
@Two-BitAlchemist:你想看看这个bitbucket.org/pypy/pypy/src/tip/pypy/objspace/std/typeobject.py