Метод класса (python) — настройка свойства (активна в методе) затем теряется

#python #methods

#python #методы

Вопрос:

Я пытаюсь создать класс, который содержит в качестве свойства данные xarray, хранящиеся как netcdf

вот как я запустил свой конструктор

 import xarray as xr

class volume:
''' volume class to contain everything about the seismic dataset
'''
def __init__(cls, name=None, netcdf=None, xarray=None):
    ''' Generic initializer
    '''
    cls.name = name
    cls.netcdf = netcdf
    cls.xarray = xarray

# ~~~~~~~~~~~~~~~~~~~~~ class method to load the netcdf file as xarray    
@classmethod
def from_netcdf(cls,netcdf_file):
        ''' Constructor
        '''
        cls.netcdf = netcdf_file

        if netcdf_file is None:
            print('Please define the netcdf file to read')
            return
        else:
            cls.xarray = xr.open_dataarray(netcdf_file)
            cls.name = cls.xarray.attrs['title']
            print('Reading data from netcdf file:{}'.format(netcdf_file))
            print(cls.__repr__(cls))
    
def __repr__(cls):
    ''' Class representation
    '''
    return 'Volume(name={}, netcdf={}, xr={})'.format(cls.name, cls.netcdf, cls.xarray)
 

затем запустите метод на экземпляре, в котором есть информация о xarray

 s1 = volume().from_netcdf('2021Feb01.netCDF')
 

Чтение данных из файла netcdf: 2021Feb01.NetCDF
Объем (имя = PSDM OVT, не отфильтрованный во времени, netcdf= 2021Feb01.NetCDF, xr=<xarray.Массив данных (IL: 484, XL: 523, TWT: 2750)>
[696113000 значений с dtype= float32]
……..

Пока все хорошо, но я теряю информацию вне метода, как вы можете видеть ниже, когда я вызываю repr, информация о свойстве теряется….

 s1.__repr__()
 

‘Нет’

Что я делаю не так? в чем исправление?

Ответ №1:

Проблема с вашим кодом заключается в том, что вы classmethod не возвращаете экземпляр самого класса.

Вот очень простой пример метода класса:

 class point: 
    def __init__(self, x, y): 
        self.x = x 
        self.y = y

    @classmethod
    def origin(cls): 
        return cls(x=0, y=0)
 

Если вы хотите исправить свой приведенный выше код, вы должны просто сделать что-то вроде:

 @classmethod
def from_netcdf(cls,netcdf_file):
    ''' Constructor'''
    return cls(
        netcdf = netcdf_file, 
        xarray = xr.open_dataarray(netcdf_file)
        name = cls.xarray.attrs['title']
    )
 

Кроме того, в приведенном выше коде для любых методов, которые не являются методами класса, вы должны использовать self вместо cls , чтобы показать различие между ними

Вот еще кое-что почитать на эту тему https://realpython.com/instance-class-and-static-methods-demystified /

Ответ №2:

отлично и спасибо, это сработало с модификацией, исправление выглядит следующим образом

«‘ python @classmethod def from_netcdf(cls,netcdf_file): «‘ Конструктор»‘ netcdf = netcdf_file xarray = xr.open_dataarray(netcdf_file) name = cls.xarray.attrs[‘title’] возвращает cls(name, netcdf,xarray) «‘

Я обнаружил, что имя заказа, netcdf, xarray должно совпадать с именем в объявлении «init»