首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用函数模拟描述符

用函数模拟描述符
EN

Stack Overflow用户
提问于 2022-02-10 02:51:49
回答 1查看 24关注 0票数 1

我试图模仿带有装饰函数的描述符,但失败了。这是我尝试过的。

代码语言:javascript
复制
def my_property(self):
    def wrapper(func):        
        return func(self)
    return wrapper

class C:
    def __init__(self):
        self._x = 0

    @my_property(C()) # this will print 0 for me, but it's not from the obj `c`
    def p(self):
        return self._x    

c = C()
print(c.p)

直接在装饰器中重写__get__也没有帮助我。我还试图继承function类并重写它的__get__方法,但是被告知function是最终的,而不是子类(也许我应该尝试forbiddenfruit https://github.com/clarete/forbiddenfruit)。

有人能帮忙吗?

编辑:为了澄清,我想知道是否可以不使用关键字class

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-10 02:59:10

你的直觉推翻__get__是正确的。事实上,Python中的属性正是这样工作的。

考虑一下

代码语言:javascript
复制
class MyProperty:

    def __init__(self, func):
        self.func = func

    def __get__(self, instance, owner):
        return self.func(instance)

MyProperty是一个实例包含func的类。当我们从类中__get__一个MyProperty实例时,它将自动调用内部函数。

现在,我们将为它创建一个整洁的包装函数。非常琐碎,但与Python对函数和类型的命名保持一致还是很好的

代码语言:javascript
复制
def my_property(func):
    return MyProperty(func)

最后,使用装饰师。

代码语言:javascript
复制
class C:
    def __init__(self):
        self._x = 0

    @my_property
    def p(self):
        return self._x

c = C()
print(c.p) # Prints 0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71059221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档