Python 在创建元组的子类时调用uuu new uuuuu

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

在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 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