#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»