元类不改变属性
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__
即可。
为什么下面的元类没有将所有属性都转换为大写?相反,它似乎什么也没做。
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__
即可。