元类不改变属性

Metaclass not altering attributes

为什么下面的元类没有将所有属性都转换为大写?相反,它似乎什么也没做。

class UpperAttrMetaclass(type):

    def __new__(cls, clsname, bases, dct):

        uppercase_attr = {}
        for name, val in dct.items():
            if not name.startswith('__'):
                uppercase_attr[name.upper()] = val
            else:
                uppercase_attr[name] = val

        return super(UpperAttrMetaclass, cls).__new__(cls, clsname, bases, uppercase_attr)


class MyKlass(object):
    __metaclass__ = UpperAttrMetaclass

    def __init__(self):
        print ("Instantiating the object in the __init__ of the class")

    def foo(self, param):
        pass

    some_attribute = 2

print("")
print ("--------------------------------------")
print ("This is the first line of the program")
print ("--------------------------------------")
m = MyKlass()
print(m)
print(m.__dict__)

所以,从评论来看,如果你想将所有实例属性直接设置为大写,你可以简单地在class本身上实现__setattr__。 (也许 __getattr__ 为了规范所有属性访问)

class UpperAttrMetaclass(type):

    def __new__(cls, clsname, bases, dct):

        uppercase_attr = {}
        for name, val in dct.items():
            if not name.startswith('__'):
                uppercase_attr[name.upper()] = val
            else:
                uppercase_attr[name] = val

        return super(UpperAttrMetaclass, cls).__new__(cls, clsname, bases, uppercase_attr)

   def __setattr__(cls, attr, value):
      if not attr.startswith("__"):
          attr  = attr.upper()
      super(UpperAttrMetaclass, cls).__setattr__(attr, value)

class MyKlass(object):
    __metaclass__ = UpperAttrMetaclass

    def __init__(self):
        print ("Instantiating the object in the __init__ of the class")

    def foo(self, param):
        pass

    def __setattr__(self, attr, value):
         super(MyKlass, self).__setattr_(attr.upper(), value)

    some_attribute = 2

对于元class 上的__setattr__,您确保class 属性等在创建class 后也被转换为大写。普通实例属性只需要class中的__setattr__即可。