使用 metaclass - python 访问 class 中的属性
Accessing attributes in class using metaclass - python
我是 python metaclass 和 运行 以下代码的新手:
class A(type):
@classmethod
def _handle_attrs(cls, class_name, bases, attrs, **kwargs):
# Now lets find all handlers defined for this class
current_attr = [(att, getattr(attrs[att], "__my_attr")) for att in attrs if
hasattr(attrs[att], '__my_attr')]
print hasattr(attrs, '__my_attr') # returns False
def __new__(cls, class_name, bases, attrs, **kwargs):
cls._handle_attrs(class_name, bases, attrs, **kwargs)
return type.__new__(cls, class_name, bases, attrs, **kwargs)
# adding the decorators args as a class attribute
def my_decorator(*args, **kwargs):
def _my_decorator(cls):
if hasattr(cls, '__my_attr'):
cls.__my_attr.update(kwargs)
else:
cls.__my_attr = kwargs
return cls
return _my_decorator
class B:
__metaclass__ = A
def get_attr_dict(self):
return getattr(self, '__my_attr', None)
@my_decorator(w = 'W')
@my_decorator(z = 'Z')
class C(B):
x = 'X'
y = 'Y'
test = C()
print test.__class__.__dict__
print test.__my_attr # this returns {'w': 'W', 'z': 'Z'}
我正在使用 class 装饰器 - my_decorator 向 C class 添加 class 属性。
在 _handle_attrs 函数中,我想对添加的属性做一些事情。
问题是添加的属性是在test._ _class__._ _dict__下添加的,在metaclass中创建C时,我不知道如何访问它们...
metaclass' __new__
是 运行 根据使用它的 class 的定义。自
@my_decorator(w = 'W', z = 'Z')
class C(B):
x = 'X'
y = 'Y'
等同于
class C(B):
x = 'X'
y = 'Y'
C = my_decorator(w = 'W', z = 'Z')(C)
很明显,当您的装饰器添加其属性时,元class 已经完成了它的工作。
我是 python metaclass 和 运行 以下代码的新手:
class A(type):
@classmethod
def _handle_attrs(cls, class_name, bases, attrs, **kwargs):
# Now lets find all handlers defined for this class
current_attr = [(att, getattr(attrs[att], "__my_attr")) for att in attrs if
hasattr(attrs[att], '__my_attr')]
print hasattr(attrs, '__my_attr') # returns False
def __new__(cls, class_name, bases, attrs, **kwargs):
cls._handle_attrs(class_name, bases, attrs, **kwargs)
return type.__new__(cls, class_name, bases, attrs, **kwargs)
# adding the decorators args as a class attribute
def my_decorator(*args, **kwargs):
def _my_decorator(cls):
if hasattr(cls, '__my_attr'):
cls.__my_attr.update(kwargs)
else:
cls.__my_attr = kwargs
return cls
return _my_decorator
class B:
__metaclass__ = A
def get_attr_dict(self):
return getattr(self, '__my_attr', None)
@my_decorator(w = 'W')
@my_decorator(z = 'Z')
class C(B):
x = 'X'
y = 'Y'
test = C()
print test.__class__.__dict__
print test.__my_attr # this returns {'w': 'W', 'z': 'Z'}
我正在使用 class 装饰器 - my_decorator 向 C class 添加 class 属性。 在 _handle_attrs 函数中,我想对添加的属性做一些事情。
问题是添加的属性是在test._ _class__._ _dict__下添加的,在metaclass中创建C时,我不知道如何访问它们...
metaclass' __new__
是 运行 根据使用它的 class 的定义。自
@my_decorator(w = 'W', z = 'Z')
class C(B):
x = 'X'
y = 'Y'
等同于
class C(B):
x = 'X'
y = 'Y'
C = my_decorator(w = 'W', z = 'Z')(C)
很明显,当您的装饰器添加其属性时,元class 已经完成了它的工作。