Python 在创建元组的子类时调用uuu new uuuuu
在Python中,当对元组进行子类化时,将使用self作为参数调用Python 在创建元组的子类时调用uuu new uuuuu,python,class,subclass,pyspark,subclassing,Python,Class,Subclass,Pyspark,Subclassing,在Python中,当对元组进行子类化时,将使用self作为参数调用\uuu new\uu函数。例如,这里是PySpark的行类的改写版本: class Row(tuple): def __new__(self, args): return tuple.__new__(self, args) 但是help(tuple)不显示的self参数 __new__(*args, **kwargs) from builtins.type Create and retu
\uuu new\uu
函数。例如,这里是PySpark的行
类的改写版本:
class Row(tuple):
def __new__(self, args):
return tuple.__new__(self, args)
但是help(tuple)
不显示的self
参数
__new__(*args, **kwargs) from builtins.type
Create and return a new object. See help(type) for accurate signature.
而help(type)
只是说了同样的话:
__new__(*args, **kwargs)
Create and return a new object. See help(type) for accurate signature.
那么,如何将self
传递到行
类定义中的\uuuuuuuuuuuuu
- 是否通过
*args
李>
\uuuuu new\uuuuuu
是否有一些细微之处,其签名可以随上下文而变化
- 或者,文档是否有误
是否可以查看元组的源代码。\uu new\uu
,以便我自己查看答案
我的问题不是重复的,因为在这个问题中,所有的讨论都提到了显式地将self
或cls
作为第一个参数的\uuuuu新的\uuuu
方法。我在努力理解
为什么tuple.\uuuu new\uuu
方法没有self
或cls
作为第一个参数
我将如何检查tuple类的源代码,以亲自了解到底发生了什么
元组的正确签名。\uuuu new\uuuu
在C中实现的函数和类型通常不能被检查,它们的签名总是这样
元组的正确签名。\uuuu new\uuuu
为:
__new__(cls[, sequence])
例如:
>>> tuple.__new__(tuple)
()
>>> tuple.__new__(tuple, [1, 2, 3])
(1, 2, 3)
毫不奇怪,这与调用tuple()
完全一样,只是您必须重复tuple
两次
\uuuu new\uuuu
请注意,\uuu new\uu
的第一个参数始终是类,而不是实例。事实上,\uuuuu new\uuuu
的作用是创建并返回新实例
特殊方法\uuuu new\uuuu
是一种静态方法
我之所以这样说是因为在你的行中。\uuuuu new\uuuuuu
我可以看到self
:虽然参数的名称并不重要(使用关键字参数时除外),但请注意self
将是Row
或Row
的子类,而不是实例。一般惯例是将第一个参数命名为cls
,而不是self
回到你的问题上来
那么,如何将self
传递到行
类定义中的\uuuuuuuuuuuuu
当您调用Row(…)
时,Python会自动调用Row.\uuuuu new\uuuuuuu(Row,…)
- 是否通过
*args
您可以按如下方式编写行。\uuuu new\uuuu
:
class Row(tuple):
def __new__(*args, **kwargs):
return tuple.__new__(*args, **kwargs)
这是可行的,没有什么错。如果你不在乎争论,这是非常有用的
\uuuuu new\uuuuuu
是否有一些细微之处,其签名可以随上下文而变化
不,关于\uuuu new\uuuu
的唯一特殊之处在于它是一个静态方法
- 或者,文档是否有误
我认为这是不完整的或模棱两可的
- 为什么
tuple.\uuuu new\uuu
方法没有self
或cls
作为第一个参数
它确实有,只是没有出现在帮助(tuple.\uuu new\uuuu)
上,因为在C中实现的函数和方法通常不会公开这些信息
- 我将如何检查
tuple
类的源代码,看看到底发生了什么
您正在查找的文件是。具体而言,您对以下功能感兴趣:
static char *kwlist[] = {"sequence", 0};
/* ... */
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
这里“|O:tuple”
的意思是:函数称为“tuple”,它接受一个可选参数(|
定义可选参数,O
代表Python对象)。可选参数可以通过关键字参数序列设置
关于帮助(键入)
为了便于参考,您正在查看类型的文档。\uuuu new\uuuu
,而您本应在帮助(类型)
的前四行停下来:
对于\uuuu new\uuuu()
而言,正确的签名是类型()的签名。
:
但这并不相关,因为tuple.\uuuu new\uuu
具有不同的签名
记住super()
!
最后但并非最不重要的一点是,尝试使用super()
而不是直接调用tuple.\uuuu new\uuuu()
。您引用的文档说明这不是完全准确的签名。\uu new\uuuuu
的第一个参数不是实例,而是类。因此,它通常被命名为cls
,而不是self
。在引擎盖下,tuple()==tuple.\uuu new\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu它将请求实例的类作为其第一个参数。”(强调我的)-它返回的值将成为传递给其他方法的self
(不同于没有返回值的\uuuuuu init\uuuuuuu()
)。请参阅感谢的答案!非常详细,现在一切都清楚多了。如果我想重新定义它的参数呢\n tuple2是从tupleWhat继承的,如果我想重新定义它的参数?tuple2来自tuple。它的行为类似于:tuple2(2)=(0,0)、tuple2(5)=(0,0,0,0,0)然而tuple.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu∠)_我不知道怎么断线@喵喵喵 您可以这样定义自己的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
class type(object)
| type(object_or_name, bases, dict)
| type(object) -> the object's type
| type(name, bases, dict) -> a new type