簡體   English   中英

為什么全局變量__metaclass__不起作用?

[英]why global variable __metaclass__ not working?

我在這里定義了一些func,它將所有用戶定義的屬性更改為大寫

def up(name, parent, attr):
    user_defined_attr = ((k, v) for k, v in attr.items() if not k.startswith('_'))
    up_attr = {k.upper(): v for k,v in user_defined_attr}
    return type(name, parent, up_attr)

例如:

my_class = up('my_class', (object,), {'some_attr': 'some_value'})

hasattr(my_class, 'SOME_ATTR')
True

這是python doc中有關元類的一些單詞

https://docs.python.org/2/reference/datamodel.html?highlight= metaclass元類

The appropriate metaclass is determined by the following precedence rules:

If dict['__metaclass__'] exists, it is used.
Otherwise, if there is at least one base class, its metaclass is used (this looks for a __class__ attribute first and if not found, uses its type).
Otherwise, if a global variable named __metaclass__ exists, it is used.
Otherwise, the old-style, classic metaclass (types.ClassType) is used.

所以我做了一些測試

>>> def up(name, parent, attr):
...     user_defined_attr = ((k, v) for k, v in attr.items() if not k.startswith('_'))
...     up_attr = {k.upper(): v for k,v in user_defined_attr}
...     return type(name, parent, up_attr)
... 
>>> 
>>> 
>>> __metaclass__ = up
>>> 
>>> class C1(object):
...     attr1 = 1
... 
>>> hasattr(C1, 'ATTR1')
False

不適用於全局var情況,為什么?

如果您使用的是Python 2,則問題是您將object列為C1的基類,並且全局__metaclass__后備的優先級低於基類的元類。

如果您使用的是Python 3,則問題是全局__metaclass__不再執行任何操作。

似乎只有老式類使用全局__metaclass__變量。 它們是老式的,與此無關,但這是它們的定義方式。 新樣式類顯式地從具有元類的類繼承,而舊樣式類則不。

class Meta(type):
    pass


__metaclass__ = Meta


class NewStyle(object):
    pass

class OldStyle:
    pass


print "new style", type(NewStyle)
print "old style", type(OldStyle)

此代碼打印:

new style <type 'type'>
old style <class '__main__.Meta'>

這似乎與您列出的規則一致。 NewStyle具有基類object ,並且該類具有自己的元類type 因此,對於新式類,根據秒規則選擇type

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM