Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python描述符get方法接受所有者类作为参数?_Python - Fatal编程技术网

为什么python描述符get方法接受所有者类作为参数?

为什么python描述符get方法接受所有者类作为参数?,python,Python,为什么a中的\uuuu get\uuu方法接受owner类作为它的第三个参数?你能举例说明它的用途吗 第一个参数(self)是不言而喻的,第二个(instances)在通常显示的描述符模式的上下文中是有意义的(如下所示),但我从未真正看到使用过第三个(owner)。有人能解释一下它的用例是什么吗 作为参考和方便回答,这是我见过的描述符的典型用法: class Container(object): class ExampleDescriptor(object): def _

为什么a中的
\uuuu get\uuu
方法接受owner类作为它的第三个参数?你能举例说明它的用途吗

第一个参数(
self
)是不言而喻的,第二个(
instances
)在通常显示的描述符模式的上下文中是有意义的(如下所示),但我从未真正看到使用过第三个(
owner
)。有人能解释一下它的用例是什么吗

作为参考和方便回答,这是我见过的描述符的典型用法:

class Container(object):
    class ExampleDescriptor(object):
        def __get__(self, instance, owner):
            return instance._name 
        def __set__(self, instance, value):
            instance._name = value
    managed_attr = ExampleDescriptor()

考虑到
实例.\uuuuu class\uuuuu
可用,我所能想到的就是显式传递类与直接从类而不是实例访问描述符有关(例如
容器.managed\u attr
)。即使如此,我也不清楚在这种情况下,在
\uuuu get\uuuuu
中会做什么。当从类而不是类的实例访问属性时,会使用
所有者
,在这种情况下,
实例
将是

在您的示例中,尝试类似于
打印(Container.managed\u attr)
的操作将失败,因为
实例
所以
实例。\u name
将引发
属性错误


您可以通过检查
实例是否为None
来改进此行为,这可能有助于记录或引发更有用的异常,以了解描述符所属的类,从而了解
所有者
属性。例如:

        def __get__(self, instance, owner):
            if instance is None:
                # special handling for Customer.managed_attr
            else:
                return instance._name 

是的,它的使用是为了在访问Container.managed_attr时描述符可以看到Container。您可以返回一些适合用例的对象,比如当描述符用于实现方法时,返回一个未绑定的方法。

当从类中访问描述符时,
实例
将为
。如果您没有考虑到这种情况(正如您的示例代码没有考虑到的),那么此时将发生错误


在那种情况下你该怎么办?理智的事如果没有其他合理的方法,您可以遵循
属性的示例,并在从类访问时返回描述符本身。

我认为Python中
\uuu get\uu
方法的
所有者
参数最著名的应用是。下面是一个纯Python版本:

导入类型
类方法:
“在Objects/funcobject.c中模拟PyClassMethod_Type()。”
定义初始化(self,f):
self.f=f
def uuu get uuu(self、instance、owner=None):
如果实例为无,所有者为无:
raise TypeError(“\uuuuu get\uuuuu(无,无)无效”)
如果所有者为无:
所有者=类型(实例)
如果hasattr(self.f,“\uuuu get\uuuuu”):
返回self.f.\uuuu获取\uuuu(所有者)
返回类型.MethodType(self.f,owner)
由于使用了
owner
参数,
classmethod
不仅可以从实例中查找属性,还可以从类中查找属性:

A类:
@类方法
def名称(cls):
返回cls.\uuu名称__
A()
A.name()#返回“A”,因此从类中查找属性也有效

“记录或引发更有用的异常”谢谢。为什么不同时实现托管类级属性?例如,当一个现有的类数据属性可以在不同的单元中看到时。比如说,Room.default\u temperature\u C,Room.default\u temperature\u F?这不是更明显的用例,还是我遗漏了什么?@max:你遗漏了什么;)--如果你想要一个详细的答案,可以作为一个常规问题来提问。OP in提出了一个很有见地的建议:无论原始对象是类实例还是类(即元类实例),只要一个参数
instance
始终绑定到原始对象,就可以实现相同的功能。如果确实需要这些信息,可以使用
isinstance(实例,类型)
进行检查。所以我再也不确定你的答案是否正确了。你能解释一下返回描述符对属性的意义吗?@Finn:有些东西在那里,所以应该返回一些东西。因为没有实例可以从中获取值,所以描述符对象是下一个最佳选择。如果您有一个具有实际(默认)类值的自定义描述符,那么在通过类访问时应该返回该描述符。