python 元类如何解决 set get 问题?

caimaoy
  • 853

https://www.codewars.com/kata...

这个上面的问题,如何解决解决?
调用参数可以在类生成的时候 装饰一下,但是成员访问,复写了 __get____set__ 方法好像没有效果

回复
阅读 1.6k
1 个回答
✓ 已被采纳
from functools import wraps
import time

class Debugger(object):
    attribute_acceses = []
    method_calls = []
  
  
def wrap(f):
    @wraps(f)
    def new_func(*args, **kwargs):
        start = time.time()
        ret = f(*args, **kwargs)
        Debugger.method_calls.append({
            'class': type(args[0]),
            'method': f.__name__,
            'args': args,
            'kwargs': kwargs,
            'time': time.time()-start
        })
        return ret
    return new_func


class Meta(type):
    def __new__(meta_cls, cls_name, cls_parent, cls_attr):
        for k, v in cls_attr.items():
            if callable(v):
                cls_attr[k] = wrap(v)
            
        def __getattribute__(self, name):
            value = super(cls, self).__getattribute__(name)
            Debugger.attribute_acceses.append({
                'action': 'get',
                'class': type(self),
                'attribute': name,
                'value': value # actual value
            })
            return value
            
        cls_attr['__getattribute__'] = __getattribute__
        
        def __setattr__(self, name, value):
            Debugger.attribute_acceses.append({
                'action': 'set',
                'class': type(self),
                'attribute': name,
                'value': value
            })
            return super(cls, self).__setattr__(name, value)
            
        cls_attr['__setattr__'] = __setattr__
            
        cls = type.__new__(meta_cls, cls_name, cls_parent, cls_attr)
        
        return cls
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏