- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 python 文档中的以下示例感到有点困惑 here .
>>> class inch(float):
... "Convert from inch to meter"
... def __new__(cls, arg=0.0):
... return float.__new__(cls, arg*0.0254)
...
>>> print inch(12)
0.3048
>>>
据推测,这里的 float 是在 Python 深处某处定义的实际 float 类。当我们调用 float.__new__(cls, argument)
时,我们偷偷调用了为给定参数返回 float 实例的函数,但我们将它传递给 inch 类而不是 float 类.既然 inch 类并没有真正做任何事情,为什么它会起作用呢?
最佳答案
因为inch
是float 的子类,它满足float.__new__()
实例工厂的所有要求。这是__new__(cls)
static method的工作创建第一个参数的实例,而不是它的“自己”类的实例。
请注意此处的“静态方法”一词。 __new__
工厂实际上只是出于继承原因而绑定(bind)到类的专用函数。换句话说,它是一个在面向对象的层次结构中发挥良好的功能。您应该通过 super()
找到它,或者直接调用它(如此处完成)。以下实际上会更像 pythonic:
def __new__(cls, arg=0.0):
return super(inch, cls).__new__(cls, arg*0.0254)
因为如果 inch
被用于多重继承层次结构,那将调用“正确的”__new__
函数;在这个简单的示例中,它最终会调用 float.__new__
。
因此,__new__(cls, ...)
应该创建类型为 cls
的实例。那么为什么要把它绑定(bind)到一个类而不是让它成为一个更通用的函数呢?因为在 float.__new__(cls, value)
的情况下,它不仅创建了 cls
类型的新实例,还将其初始值设置为 value
。为了让它工作,float.__new__(...)
需要深入了解 float
类的外观。因为 inch()
是 float()
的子类,所以它也具有成为 float()
的完全相同的必要位,因此当 float.__new__()
工厂创建一个新的 inch
实例时,所有这些位都会使它成为一个 inch()
实例。
关于Python:当 cls 不是 float 时,为什么 float.__new__(cls) 可以工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13534461/
为什么下面的代码会出错? class Foo: def __new__(cls, *args, **kwargs): print("Creating Instance")
Documentation for object.__new__(cls[, ...]) says: Called to create a new instance of class cls. __
编码异常类,我遇到了这个错误: TypeError: object.__new__(A) 不安全,使用 Exception.__new__() 这里有一个类似的问题: TypeError: objec
以下是使用 PyCharm Community Edition 中的 Tkinter 在 Python 3.0 中对 Conway 的生命游戏的不完整实现。 程序由四个文件组成: Cell.py:包含
阅读本文时:What is a metaclass in Python? ,我正在学习使用 __new__ 使用以下代码段:- class a(object): pass a.__new__(
前言 我想要具有以下属性的 2 个类 Interval 和 Segment: Interval 可以有 start 和 end 点,它们中的任何一个都可以被包含/排除(我已经使用必需的标志参数实现了这
我知道当我们通过 super 方法调用父方法时,我们可以忽略绑定(bind)方法中的“self”参数,如下所示: class Foo(object): def __init__(self):
假设以下代码: class NumStorage(object): def __new__(cls, *nargs): name = cls.__name__
嗨,我一直收到这个错误,我不知道如何避免。 我有以下代码: class retrieve_account_data(Thread): _account_queue = None _di
假设我有一些调用 __new__ 的类,我如何才能很好地使用 mro 并根据需要调用父类(super class)的 __new__(带参数),但不使用附加参数调用 object.__new__?例如
我正在尝试像这样深度复制我的 igraph 对象: copy.deepcopy(graph) 其中 graph 是 igraph 对象,一个只有几个顶点的完整图。但是我得到这个错误: Fi
假设我有以下代码用于处理个人和国家/地区之间的链接: from dataclasses import dataclass @dataclass class Country: iso2 : st
我知道类是元类的实例,并且 __new__ 在 __init__ 之前运行,因为,您必须在初始化它之前创建一个实例。 现在想象一下: import time class ConfigurationsM
使用Python元类A创建一个新类B。 当C继承B时,为什么调用A的__new__方法? class A(type): def __new__(cls, name, bases, attrs)
案例1: class Person: def __new__(cls, *args, **kwargs): print "called" return supe
我可以知道为什么 myClass1 和 myClass2 在覆盖 __new__() 方法时表现不同吗?推荐使用哪种方式来编写类,为什么?我认为 myClass1(): 甚至没有调用 __new__(
当__new__返回类的实例时,一切正常,我们可以毫无问题地创建子类: class A: def __new__(cls, p1, p2): self = object.__n
如何编写默认的 __new__ 并进行一些小的更改,如下所示: class A: def __new__(cls, *args, **kwargs): retval = sup
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我一直在努力理解__new__ 和元编程。所以我看了一下官方的 python 源代码。 http://hg.python.org/cpython/file/2.7/Lib/fractions.py 分
我是一名优秀的程序员,十分优秀!