Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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的描述符类 >class Const(object):#一个覆盖描述符,请参见下文 ... 定义初始值(自身,值): ... 自我价值=价值 ... 定义设置(自身,值): ... 自我价值=价值 ... def uu get uu(self,*35;):#始终返回常量值 ... 回归自我价值 ... >>> >>>X类(对象): ... c=常数(23) ... >>>x=x() >>>印刷品(x.c)#印刷品:23 23 >>>x.c=42 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:\uuuu set\uuuuu()接受2个位置参数,但给出了3个_Python_Python 3.x_Exception_Constants_Descriptor - Fatal编程技术网

创建“一个”的问题;常数;Python的描述符类 >class Const(object):#一个覆盖描述符,请参见下文 ... 定义初始值(自身,值): ... 自我价值=价值 ... 定义设置(自身,值): ... 自我价值=价值 ... def uu get uu(self,*35;):#始终返回常量值 ... 回归自我价值 ... >>> >>>X类(对象): ... c=常数(23) ... >>>x=x() >>>印刷品(x.c)#印刷品:23 23 >>>x.c=42 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:\uuuu set\uuuuu()接受2个位置参数,但给出了3个

创建“一个”的问题;常数;Python的描述符类 >class Const(object):#一个覆盖描述符,请参见下文 ... 定义初始值(自身,值): ... 自我价值=价值 ... 定义设置(自身,值): ... 自我价值=价值 ... def uu get uu(self,*35;):#始终返回常量值 ... 回归自我价值 ... >>> >>>X类(对象): ... c=常数(23) ... >>>x=x() >>>印刷品(x.c)#印刷品:23 23 >>>x.c=42 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:\uuuu set\uuuuu()接受2个位置参数,但给出了3个,python,python-3.x,exception,constants,descriptor,Python,Python 3.x,Exception,Constants,Descriptor,什么是 TypeError:\uuuu set\uuuu()接受2个位置参数,但给出了3个参数` 意味着什么 \uuu set\uu()是属于描述符类型Const的方法吗 什么是\uuuu set\uuuu()的签名 谢谢。签名购买u\u套装__ __集_的签名记录如下: 对象。调用\uuuu set(self、instance、value)将属性设置为 将所有者类的实例转换为新值value 打字错误的含义 TypeError是告诉您缺少实例参数,它应该是def\uuu set\uuu(self

什么是

TypeError:\uuuu set\uuuu()
接受2个位置参数,但给出了3个参数`

意味着什么

\uuu set\uu()
是属于描述符类型
Const
的方法吗

什么是
\uuuu set\uuuu()
的签名

谢谢。

签名购买u\u套装__ __集_的签名记录如下:

对象。调用\uuuu set(self、instance、value)将属性设置为 将所有者类的实例转换为新值value

打字错误的含义 TypeError是告诉您缺少实例参数,它应该是
def\uuu set\uuu(self,instance,value):…

制定解决方案 下面是一种使常量类正确工作的方法:

>>> class Const(object):        # an overriding descriptor, see later
...     def __init__(self, value):
...         self.value = value
...     def __set__(self, value):
...         self.value = value
...     def __get__(self, *_):  # always return the constant value
...         return self.value
... 
>>> 
>>> class X(object):
...     c = Const(23)
... 
>>> x=X()
>>> print(x.c)  # prints: 23
23
>>> x.c = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __set__() takes 2 positional arguments but 3 were given
在交互式会话中进行尝试可提供:

class Const(object):
    def __init__(self, value):
        self._value = value
    def __set__(self, inst, value):
        raise TypeError('Cannot assign to a constant')
    def __get__(self, inst, cls=None):
        return self._value

class X(object):
    c = Const(23)
>>x=x()
>>>印刷品(x.c)
23
>>>x.c=42
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
x、 c=42
文件“/Users/raymond/Documents/try_-forth/tmp.py”,第5行,在集合中__
raise TypeError('无法分配给常数')
TypeError:无法分配给常量

建议重新打开。这只是部分重叠(即相同的主题类别,但不是实际的问题、情况或细节)。特别是,这个问题是关于一个生成常量的工具(这是新的),重点是_set_方法(这是新的),以及错误签名(这也是新的)的类型错误的具体问题@RaymondHettinger:replicate通过提供正确的签名回答了为什么出现
TypeError
的问题。这就是最初的全部问题;它没有询问
Const
的用途。(在考虑OP的评论时,副本更合适。)@Ryan你似乎对“精确副本”有不同的概念,现在导致一个有趣的变体丢失。此外,第二次关闭似乎是滥用。这本应该留给其他人来决定是否同意,而不是做出一个独断的决定,凌驾于该领域顶级贡献者的洞察力之上。根据你的推理,关于描述符的每一个问题都会被标记为模糊的“理解描述符”问题的重复。@RaymondHettinger:这不是一个有趣的变体。这是缺乏基础研究。还请注意,结束原因不再是“完全重复”,而是“这个问题在这里已经有了答案”;“这是一个故意的改变,正是为了这种情况而做出的。”Ryan在其他答案中没有提到创建Const()类。此外,您第一次评论“前10个谷歌结果中的任何一个…”不符合StackOverflow标准,表明您并不真正理解OP手头的任务。谢谢!(1)
对象的两个参数
self
instance
之间有什么区别?它们是否都引用了类的同一个实例(如果是,为什么同一个参数需要两个参数)?(2) 在
object.\uuuuu get\uuuuu(self,instance,owner)
中,类似地,两个参数
self
instance
之间有什么区别?
owner
是否引用该类(如果是,为什么我们需要该类的参数,因为我们可以引用该类而不将其作为参数传递)?“self”是Const的实例,“inst”是X类的实例。
>>> x = X()
>>> print(x.c)
23
>>> x.c = 42
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    x.c = 42
  File "/Users/raymond/Documents/try_forth/tmp.py", line 5, in __set__
    raise TypeError('Cannot assign to a constant')
TypeError: Cannot assign to a constant