代码之家  ›  专栏  ›  技术社区  ›  showkey

包含__getattribute__的类是描述符吗?[已关闭]

  •  -1
  • showkey  · 技术社区  · 1 年前

    在python3的手册中:
    https://docs.python.org/3/howto/descriptor.html#definition-and-introduction
    通常,描述符是一个属性值,它具有描述符协议中的一个方法。这些方法是 __get__() , __set__() __delete__() 如果这些方法中的任何一个是为属性定义的,则称其为描述符。

    class Room:
        def __init__(self,name):
            self.name = name
        def __getattribute__(self,attr):
            return  object.__getattribute__(self,attr)
        def __setattr__(self,attr,value):
            return  object.__setattr__(self,attr,value)
    

    __getattribute__ __setattr__ 是python的神奇方法,内置函数, Room 类使用魔术方法实现 __get__ __set__ 严格地说,是阶级 房间 描述符

    2 回复  |  直到 1 年前
        1
  •  3
  •   Blckknght    1 年前

    不可能“伪造” __get__ , __set__ __delete__ 通过实现 __getattribute__ 方法你不能用其他特殊的方法,比如 __len__ __add__ 任何一个

    这是因为双下划线名称只是Python解释器用来描述类行为的较低级别槽的Python级别包装器。当一个方法被分配给一个特殊的名称时,比如 __得到__ __添加__ ,类结构中的相应槽得到更新,以便解释器知道在对象上调用相关语言功能(例如描述符行为或添加)时调用该方法。当这种情况发生时,方法的内部查找不会通过 __getattribute__ 方法所以即使 __getattribute__ 尝试提供 __得到__ (或 __添加__ __len__ )方法,它不会起作用。

        2
  •  1
  •   Blckknght    1 年前

    这个 Room 类不是描述符。Python中的描述符是一个类,它至少实现一个描述符方法: __get__() , __set__() __delete__() 这些方法定义描述符如何与所有者对象的属性交互。

    在Room类中 __getattribute__() __setattr__() 方法分别用于拦截属性访问和分配操作。但是,这些方法本身并不能使Room成为描述符。它们是为每个属性访问和分配自动调用的特殊方法,无论属性是否为描述符。

    要使类Room成为描述符,您需要至少实现一个描述符方法( __获取__() , __设置__() __删除__() )。目前,示例中的Room类只是像普通类一样使用神奇的方法来处理属性访问和分配,但它不符合被视为描述符的标准。

    要创建描述符,您需要定义前面提到的一个或多个描述符方法,通常在一个单独的类中,然后使用该类的实例作为另一个类的属性。当访问、设置或删除所有者对象的属性时,将调用描述符方法。。。。。谷歌翻译