2016-04-26 11 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) 

Ich habe versucht, diesen Code auf Python 3.4.3 und 2.7.11 auszuführen. In 2.7.11 es funktioniert gut (Ausgabe - 77), aber 3.4.3 throw Attribut FehlerMetaclass konfigurieren. Python-Versionskonflikt

Hier ist der Ausgang (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 

Wie kann ich dieses Problem beheben? Metaklassen funktionieren anders?

Antwort

1

In python3 erklären Sie die Metaklasse inline:

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

Ich denke, dass 2to3 damit umgehen sollte, aber wenn Sie beide in der gleichen Quelldatei unterstützen müssen ohne 2to3 zu verwenden, dann werden Sie wahrscheinlich wollen eine Art Shimmer-Bibliothek. six ist der De-facto-Standard hier. Sie möchten six.with_metaclass verwenden:

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