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

发布于 2022-09-06 04:55:35 字数 231 浏览 11 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

陪我终i 2022-09-13 04:55:35
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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文