【问题标题】:Python how to get __qualname__ of method wrapped with property.setterPython如何获取用property.setter包装的方法的__qualname__
【发布时间】:2020-04-06 07:32:21
【问题描述】:

我有一个实例属性,我使用 Python 的 property 装饰器创建了一个属性。

然后我使用装饰器 @property_name.setter 为该属性创建了一个 setter。

我怎样才能得到原始方法定义的__qualname__,用@property.setter装饰?


我看过的地方


示例代码

这是写在Python 3.6

#!/usr/bin/env python3


def print_qualname():
    """Wraps a method, printing its qualified name."""

    def print_qualname_decorator(func):
        # print(f"func = {func} and dir(): {dir(func)}")
        if hasattr(func, "__qualname__"):
            print(f"Qualified name = {func.__qualname__}.")
        else:
            print("Doesn't have qualified name.")

    return print_qualname_decorator


class SomeClass:

    def __init__(self):
        self._some_attr = 0
        self._another_attr = 0

    @property
    def some_attr(self) -> int:
        return self._some_attr

    @print_qualname()
    @some_attr.setter
    def some_attr(self, val: int) -> None:
        self._some_attr = val

    @print_qualname()
    def get_another_attr(self) -> int:
        return self._another_attr

输出:

Doesn't have qualified name.
Qualified name = SomeClass.get_another_attr.

如何从 print_qualname 装饰器中获取 __qualname__some_attr?换句话说,如何输出SomeClass.some_attr

【问题讨论】:

    标签: python properties python-decorators descriptor python-descriptors


    【解决方案1】:

    您可以为 setter 翻转装饰器的顺序。注意我已经调整了print_qualname_decorator 来调用底层函数并返回它(否则setter 将不会执行)。

    from functools import wraps
    
    def print_qualname(func):
        """Wraps a method, printing its qualified name."""
        @wraps(func)
        def print_qualname_decorator(*args):
            if hasattr(func, "__qualname__"):
                print(f"Qualified name = {func.__qualname__}.")
            else:
                print("Doesn't have qualified name.")
            return func(*args)
        return print_qualname_decorator
    
    
    class SomeClass:
    
        def __init__(self):
            self._some_attr = 0
            self._another_attr = 0
    
        @property
        def some_attr(self) -> int:
            return self._some_attr
    
        @some_attr.setter
        @print_qualname
        def some_attr(self, val: int) -> None:
            self._some_attr = val
    
        @print_qualname
        def get_another_attr(self) -> int:
            return self._another_attr
    

    使用

    In [46]: foo = SomeClass()                                               
    
    In [47]: foo.get_another_attr()                                          
    Qualified name = SomeClass.get_another_attr.
    Out[47]: 0
    
    In [48]: foo.some_attr = 5                                               
    Qualified name = SomeClass.some_attr.
    
    In [49]: foo._some_attr                                                  
    Out[49]: 5
    

    【讨论】:

    • 谢谢@KentShikama!没想到
    猜你喜欢
    • 2020-04-07
    • 2020-07-30
    • 2018-11-21
    • 2020-08-20
    • 2021-06-08
    • 2018-12-15
    • 2018-11-25
    • 2020-01-26
    • 1970-01-01
    相关资源
    最近更新 更多