- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最终目标:让 isinstance(MyClass(), np.ndarray)
和 issubclass(MyClass, np.ndarray)
均返回 True
没有 MyClass
调用 np.ndarray.__new__()
。
假设我已经实现了 numpy.ndarray
的所有方法,并且我想对其进行设置,以便它能够通过 ndarray<的
,但我不希望它实际上从 isinstance
检查ndarray
调用 __new__
。
最初,我在想这样的事情:
import numpy as np
class BlockingClass(np.ndarray):
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
不幸的是,尝试实例化 Dummy()
会产生此错误,表明它不安全:
TypeError: object.__new__(Dummy) is not safe, use numpy.ndarray.__new__()
如果它是对象的子类,则此方法有效:
class BlockingClass2(object):
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
BlockingClass2() # No error
我很确定这是因为 ndarray 是一个 C 类,所以我正在考虑在 C 类(或者最好是 Cython 类)中重写它,并使用多重继承来无需调用 __new__ 即可进行类型检查。所以我的类(class)是:
类 MyClass(BlockingClass, np.ndarray): 通过
其中BlockingClass
是c 定义的函数。我真的更喜欢在 Cython 中执行此操作,但我不知道如何让它工作。我尝试过这样做:
cdef class BlockingClass:
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
但这会产生与 __cinit__
相同的“不安全”错误。
cdef class BlockingClass:
def __cinit__(self, *args, **kwargs):
# do stuff
return self
但是,当 BlockingClass
像上面那样通过定义 __new__
的对象通过多重继承进行子类化时,该 __new__
方法仍然会被调用。如果我无法在 Cython 中执行此操作,那么我需要定义一个基类,通过多重继承跳过 ndarray 的 __new__ 的最少 C 代码量是多少?也许我可以导入一个函数来实例化该类,而无需升级 mro?
最佳答案
我不知道是否可以伪造 isinstance
和 issubclass
,但在以下方法中,您可以定义传递给 np.ndarray 的类.__new__
仅您想要的参数:
import numpy as np
class BlockingClass(np.ndarray):
def __new__(cls, *args, **kwargs):
ndarray_kw = ['shape', 'dtype', 'buffer' 'offset', 'strides', 'order']
to_ndarray = {}
to_myclass = {}
for k,v in kwargs.items():
if k not in ndarray_kw:
to_myclass[k] = v
else:
to_ndarray[k] = v
new = np.ndarray.__new__(cls, *args, **to_ndarray)
for k,v in to_myclass.items():
setattr(new, k, v)
return new
def __init__(self, *args, **kwargs):
self.test = 1
self.args = args
self.kwargs = kwargs
关于python - 跳过 ndarray 子类中的 numpy __new__ (或者可能覆盖/定义 C 或 cython 中的类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284660/
为什么下面的代码会出错? 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 分
我是一名优秀的程序员,十分优秀!