2016-04-26 81 views
1
class UpperAttrMetaclass(type): 
    def __new__(cls, name, bases, attrs): 
     attrs["b"] = 77 
     return super(UpperAttrMetaclass, cls).__new__(cls, name, bases, attrs) 

class Cls(object): 
    __metaclass__ = UpperAttrMetaclass 

f = Cls() 
print(f.b) 

我試着在Python 3.4.3和2.7.11上運行這段代碼。 在2.7.11它工作得很好(輸出 - 77),但拋3.4.3屬性錯誤Metaclass配置。 Python版本衝突

這裏是輸出(3.4.3)

Traceback (most recent call last): 
    File "D:/LABS/BSUIR_labs/4cem/PYTHON/lab2/meta.py", line 8, in <module> 
    print(f.b) 
AttributeError: 'Cls' object has no attribute 'b' 

Process finished with exit code 1 

我怎樣才能解決這個問題?元類以不同的方式工作?

回答

1

在python3,聲明元類在線:

class Cls(object, metaclass=UpperAttrMetaclass): 
    ... 

我認爲2to3應該處理這個問題,但如果你需要同時支持相同的源文件中沒有使用2to3,那麼你可能會想某種形式的勻場庫。 six這裏是事實上的標準。您需要使用six.with_metaclass

import six 
class Cls(six.with_metaclass(UpperAttrMetaclass, object)): 
    ...