创建“一个”的问题;常数;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