Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python子类属性赢得';t初始化_Python_Class_Inheritance_Python Xarray - Fatal编程技术网

Python子类属性赢得';t初始化

Python子类属性赢得';t初始化,python,class,inheritance,python-xarray,Python,Class,Inheritance,Python Xarray,我正在构建一个子类,该子类继承自xarray Dataset类,但我希望使用xarray open_Dataset函数返回实例。原因是xarray的open_数据集可以链接到大型数据集,而无需像手动初始化数据集实例时那样将它们加载到内存中。我不想修改这个函数,所以为了避免这个问题,我修改了Dataset的“new”方法,以返回我自己的类,如下所示 def open_dataset(nc_file, data_type): data_objs = { "my_cl

我正在构建一个子类,该子类继承自xarray Dataset类,但我希望使用xarray open_Dataset函数返回实例。原因是xarray的open_数据集可以链接到大型数据集,而无需像手动初始化数据集实例时那样将它们加载到内存中。我不想修改这个函数,所以为了避免这个问题,我修改了Dataset的“new”方法,以返回我自己的类,如下所示

def open_dataset(nc_file, data_type):
    data_objs = {
        "my_class": MyClass,
    }
    obj = data_objs[data_type]

    def __new__(cls, *args, **kwargs):
        if cls == xr.Dataset:
            return object.__new__(obj)
        return object.__new__(cls)

    xr.Dataset.__new__ = staticmethod(__new__)

    obj = xr.open_dataset(nc_file)
    return obj
然后,我可以如下定义我的类,并成功地从open_dataset函数获取MyClass实例,该函数具有可访问和可用的my_方法

class MyClass(xr.Dataset)
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.my_attribute = 1
        print("in the init")


    def my_method(self):
        print("hello!")

但是,这些实例没有初始化my_属性。我已经通过添加一个print语句检查了“init”正在执行,并且我得到了一个打印输出。因此,我不明白为什么这个init中的属性没有初始化。

如何调用方法和属性?您能显示代码吗?简单地替换
Dataset
,即导入xarray.core.Dataset,不是更容易吗;xarray.core.dataset.dataset=MyClass。这不需要任何
\uuuuuuuuuuuuuuuuuuuu
黑客。顺便问一下,为什么不将
*args、**kwargs
传递到
\uuuuuuuuuuu
中?如何调用方法和属性?您能显示代码吗?简单地替换
Dataset
,即导入xarray.core.Dataset,不是更容易吗;xarray.core.dataset.dataset=MyClass。这不需要任何
\uuuuuuuuuuuuuuuuuuuu
黑客。顺便问一下,你为什么不把
*args、**kwargs
传递到
\uuuuuuu新的\uuuuu