2016-04-26 13 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スロー属性エラーここメタクラスを構成します。 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)): 
    ... 
関連する問題