Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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 可变自定义类&;描述符混淆_Python_Oop_Dictionary_Descriptor - Fatal编程技术网

Python 可变自定义类&;描述符混淆

Python 可变自定义类&;描述符混淆,python,oop,dictionary,descriptor,Python,Oop,Dictionary,Descriptor,我试图理解描述符是如何工作的,尤其是与自定义可变类结合使用时 我的问题的一个希望简洁的摘要: 我如何创建一个自定义类,它将有描述符,但将是可变的 现在让我们添加一些上下文和内容。我最近一直在学习Pluralsights高级Python课程,在那里他们引入了描述符。因此,我使用课程中的模式。但它并没有像我预期的那样起作用 描述符的模式: 我正在使用的是一个非常不同的,但它有相同的模式只是它执行的检查更复杂。但那部分是 单元测试,所以我真的不认为这是一个问题,因为 进一步的理由请继续阅读 描述的

我试图理解描述符是如何工作的,尤其是与自定义可变类结合使用时

我的问题的一个希望简洁的摘要:

  • 我如何创建一个自定义类,它将有描述符,但将是可变的
现在让我们添加一些上下文和内容。我最近一直在学习Pluralsights高级Python课程,在那里他们引入了描述符。因此,我使用课程中的模式。但它并没有像我预期的那样起作用

描述符的模式

我正在使用的是一个非常不同的,但它有相同的模式只是它执行的检查更复杂。但那部分是 单元测试,所以我真的不认为这是一个问题,因为 进一步的理由请继续阅读

描述的自定义类

在这里,我再次提出了类的脚手架,以避免实际类实现的不必要的大量代码。 基本上,我想要的是有一个自定义类,它实现了排序 集合的接口,该集合由 描述符。更准确地说,我正在实施 DataFrame,对于它,我在其 形状,以存储某些对象,我希望我的自定义类是 数据帧的字典式接口

现在,对我所遇到的错误的解释是:

大多数错误都是围绕着
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
但是,据我所知,实现
\uuuuuuuuhash\uuuuuu
\uuuuuuuueq\uuuuuu
,使它们具有相同的比较结果,是一种承诺,即对象在其运行时生命周期内不会发生变异(更改)。 就我而言,这绝对不是事实

我已经实现了
\uuuuu hash\uuuu
\uuuuu eq\uuuuu
的版本,这些版本使它工作正常,并删除了错误。然而,这基本上是一个谎言,因为:

  • 我希望能够比较我的对象,比较会告诉我它们“持有”的信息是否相同
希望我的问题足够详细,可以理解

一种可能的重新措辞是如何在非哈希表中使用描述符 自定义类。或者如何制作一个能与 非散列自定义类


通常的方法是使用
property
而不是自定义描述符类,并将数据存储在实例上而不是描述符上:

class Mutable(object):
    def __init__(self, x):
        self.x = x
    @property
    def x(self):
        return self._x
    @x.setter(self, x):
        if x <= 0:
            raise ValueError("x must be positive")
        self._x = x
否则,您必须告诉描述符在其构造函数中使用什么名称:

class Positive(object):
    def __init__(self, underlying):
        self.underlying = underlying
    ...

class Mutable(object):
    x = Positive('_x')
    ...

对不起,我完全不明白你的问题是什么。您说“大多数错误都与哈希实现有关”,但代码中没有
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
方法。您的
MutableClass
无法实例化,因为您没有实现所有
MutableMapping
方法。您正在尝试将字典分配给
self.descriptor
,它只接受正数。所有这些都毫无意义。我想如果你用一些代码来代替这个冗长的解释,用代码来展示哪些不起作用,那会有很大的帮助。是的,我不清楚你的问题到底是什么。您的问题似乎根本与描述符无关,而是关于可散列对象的问题。@Rawing是的,我忘了提到,所有这些都是实现的。我应该更清楚一点,重点是,我不希望实现哈希函数,因为这个类的值在其生命周期内会发生变化。我所做的实现是可行的,但它只是散列了一些类的不可更改值。不太理想。答案是信息丰富的,名称部分不是什么大问题。我将尝试您的建议,将其作为具有复杂setter的属性来实现。如果它能处理所有其他相关的事情,我会接受这个答案:)我将它作为描述符实现,因为我希望重用,而不是复制其他类中复杂的setter代码。因此,我认为自定义描述符是正确的方法。@SirSteel您不必这样做,只需定义一个模块级函数:
def\u getter(self):…
def\u setter(self,x):…
然后在类定义中,使用
x=property(\u getter,\u setter)
是的,我正在尝试。可能是更好的选择。我只是希望能够跨多个模块重用setter。
class Mutable(object):
    def __init__(self, x):
        self.x = x
    @property
    def x(self):
        return self._x
    @x.setter(self, x):
        if x <= 0:
            raise ValueError("x must be positive")
        self._x = x
class PositiveAttr:
    def __set_name__(self, owner, name):
        self.underlying = f'_{name}'
    def __get__(self, instance, owner):
        if instance is None:
            return self
        return getattr(instance, self.underlying)
    def __set__(self, instance, value):
        if value <= 0:
            raise ValueError("Attribute must be positive")
        setattr(instance, self.underlying, value)

class Mutable:
    x = Positive()
    ...
class Positive(object):
    def __init__(self, underlying):
        self.underlying = underlying
    ...

class Mutable(object):
    x = Positive('_x')
    ...