python教程—Python中的_new__和_init__-Python实用宝典

python教程—Python中的_new__和_init__

我正在学习Python,到目前为止,我可以在下面讲述关于……new__和……init__的事情:但是现在我有另一个问题。

我正在学习Python,到目前为止,我可以告诉以下关于……new__和……init__的事情:

  1. 是对象创建
  2. 是对象初始化
  3. 在初始化内部状态之前调用。
  4. 对于不可变对象来说,_new__很好,因为它们一旦被赋值就不能被更改。我们可以返回具有新状态的新实例。
  5. 我们可以对两个可变对象使用_new__和_init__,因为它的内部状态可以更改。

但现在我有另一个问题。

  1. 当我创建一个新的实例,比如a = MyClass("hello","world"),这些参数是如何传递的?我的意思是,我应该如何使用……init__和……new__构造类,因为它们是不同的,并且除了默认的第一个参数外,它们都接受任意参数。
  2. self关键字是在名称方面可以改成别的东西吗?但是我想知道cls在名称方面是否会改变为其他东西因为它只是一个参数名称?

我做了一个小实验如下:

    >>> class MyClass(tuple): def __new__(tuple): return [1,2,3]

我是这样做的:

    >>> a = MyClass() >>> a [1, 2, 3]

尽管我说我想返回元组,但这段代码运行良好,并返回了我[1,2,3]。我知道在调用了_new__函数之后,我们将传递第一个参数作为我们希望接收的类型。我们讨论的是新函数,对吧?我不知道其他语言返回类型除了绑定类型?

我还做了其他事情:

    >>> issubclass(MyClass,list) False >>> issubclass(MyClass,tuple) True >>> isinstance(a,MyClass) False >>> isinstance(a,tuple) False >>> isinstance(a,list) True

我没有做更多的实验,因为更远的地方不太亮,我决定就此打住,决定问问StackOverflow。

我读过这样的帖子:

  1. Python对象创建

回答

我应该如何使用……init__和……new__构造类,因为它们是不同的,并且除了默认的第一个参数外,它们都接受任意参数。

你很少需要担心……new__。通常,您只需定义_init__,并让默认的_new__将构造函数参数传递给它。

self关键字是在名称方面可以改成别的东西吗?但是我想知道cls在名称方面是否会改变为其他东西因为它只是一个参数名称?

它们都是参数名,在语言中没有特殊的含义。但是在Python社区中,它们的使用是一个非常的强大约定;大多数Pythonistas都不会 在这些上下文中更改名称self和cls,当其他人更改时,他们会感到困惑。

注意,使用def _new__(tuple)会在构造函数中重新绑定名称元组。当实际实现_new__时,您将希望将其作为

成年协议“/a> here”)。能够返回与所请求的类型不同的类型对于实现工厂非常有用:您可以返回所请求类型的子类。

这也解释了您所观察到的issubclass/isinstance行为:子类关系遵循您对类MyClass(tuple)的使用,isinstance反映您从_new__返回了“错误的”类型。

参考资料,请查看Python语言引用中对_new__要求。

Edit > /strong>:好的,这里有一个潜在有用的使用……new__的例子。Eel类跟踪过程中存活的鳗鱼数量,如果超过某个最大值,则拒绝分配。


注意,有更聪明的方法来完成这个行为。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论