这个类不是描述符类吧?

描述符的定义:
https://python-reference.readthedocs.io/en/latest/docs/dunder...
In general, a descriptor is an object attribute with “binding behavior”, one whose attribute access has been overridden by methods in the descriptor protocol: __get__(), __set__(), and __delete__(). If any of those methods are defined for an object, it is said to be a descriptor.
下面这个Room类不是描述符吧?

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

虽然它的行为有set,get,但是人家是通过魔术方法实现的!

阅读 2.1k
1 个回答

根据python定义,描述符类需要实现 __get__()、__set__() 和 __delete__() 方法,并且通常用于控制对其他类的属性访问。也就是说,可以对属性的读取和修改进行自定义操作。
比方说举个简单的代码示例:

class Descriptor:
    def __get__(self, instance, owner):
        # 处理属性的读取操作
        pass
    
    def __set__(self, instance, value):
        # 处理属性的赋值操作
        pass

class MyClass:
    attribute = Descriptor()

所以我们现在回过头来看看你的例子里面 Room 类中,虽然说它实现了 __getattribute__() 和 __setattr__() 魔术方法,但是根据定义来看,这并不使它成为描述符类。这两个魔术方法是用于处理对象的属性访问和赋值的通用方法,而不是描述符协议所要求的特定方法。