html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue https://github.com/pydata/xarray/issues/3582#issuecomment-559860016,https://api.github.com/repos/pydata/xarray/issues/3582,559860016,MDEyOklzc3VlQ29tbWVudDU1OTg2MDAxNg==,17710617,2019-11-29T18:24:49Z,2019-11-29T18:24:49Z,CONTRIBUTOR,"Ok thanks for the recommandations. I'm thinking of using this kind of class to handle object creation: ```python import xarray as xr import motion class Analogs: def __new__(cls, ...): array = xr.DataArray(...) cls.verify(array) return array @staticmethod def verify(array): print(""verification..."") @classmethod def from_csv(cls, filename:str, ...): array = xr.DataArray(filename, ...) cls.verify(array) return array ``` Let's say I define another `Markers` class for another type of data. Is it possible that my accessor exposes different functions according to class e, g: ```python @xr.register_dataarray_accessor(""foo"") class DataArrayAccessor(object): def __init__(self, xarray_obj: xr.DataArray): self._obj = xarray_obj def to_csv(self): """""" This function is exposed to all objects but behave differently if it is a Markers or an Analogs """""" def marker_only_function(self): """""" This function is only exposed to array created with the Marker class """""" def analog_only_function(self): """""" This function is only exposed to array created with the Analog class """""" ``` My ultimate goal is to have this kind of API: ```python analogs = ( Analogs.from_csv(""filename.csv"") .foo.center() # foo accessor generic method .foo.rectify() # foo accessor specific method for Analogs object .mean() # xarray method ) ```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,530062582 https://github.com/pydata/xarray/issues/3582#issuecomment-559847335,https://api.github.com/repos/pydata/xarray/issues/3582,559847335,MDEyOklzc3VlQ29tbWVudDU1OTg0NzMzNQ==,6213168,2019-11-29T17:10:40Z,2019-11-29T17:10:40Z,MEMBER,"+1 to shoyer - encapsulation is by far the easiest approach. >> Why can't you initialise whatever you need to upon first access? > How do you do that? ```python @xarray.register_dataset_accessor('foo') class FooAccessor: def __init__(self, xarray_obj): self.obj = xarray_obj # self.x = something(xarray_obj) @property def bar(self): # snip def baz(self): # snip ``` The accessor ``__init__`` method will be invoked by xarray the first time you invoke ``array.foo``. Note, however, that it is not recommended to put expensive calculations in it, because the object will *possibly* be destroyed and reinitialised every time the array is transformed - or in other words, anything that is not a read-only method/property or a cell update. I emphasized *possibly* because some transforms may not destroy and recreate your accessor instance, thus potentially causing it to be in a state that is incoherent with the attached xarray object. Every time you invoke a method, you should verify that whatever assumptions you relied upon to generate the state are still valid.","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,530062582 https://github.com/pydata/xarray/issues/3582#issuecomment-559663153,https://api.github.com/repos/pydata/xarray/issues/3582,559663153,MDEyOklzc3VlQ29tbWVudDU1OTY2MzE1Mw==,1217238,2019-11-29T05:22:29Z,2019-11-29T05:22:29Z,MEMBER,"What about simply wrapping xarray objects internally in your classes, along with utilities for converting to/from xarray objects? When users want to do domain specific stuff they can use your objects, and when they want to do something generic with xarray they can convert by calling a method like `to_xarray`.","{""total_count"": 2, ""+1"": 2, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,530062582 https://github.com/pydata/xarray/issues/3582#issuecomment-559607756,https://api.github.com/repos/pydata/xarray/issues/3582,559607756,MDEyOklzc3VlQ29tbWVudDU1OTYwNzc1Ng==,17710617,2019-11-28T21:44:08Z,2019-11-28T21:44:08Z,CONTRIBUTOR,"> Is it because you would need a hook that is triggered by DataArray. __init__ Yes, I need to test some properties when creating the `DataArray` such as shape and dimensions properties. > Why can't you initialise whatever you need to upon first access? How do you do that?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,530062582 https://github.com/pydata/xarray/issues/3582#issuecomment-559606839,https://api.github.com/repos/pydata/xarray/issues/3582,559606839,MDEyOklzc3VlQ29tbWVudDU1OTYwNjgzOQ==,6213168,2019-11-28T21:36:39Z,2019-11-28T21:36:39Z,MEMBER,Give a careful read to #3268 if statefulness (beyond what can be stored in xarray variables) is important for you. ,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,530062582 https://github.com/pydata/xarray/issues/3582#issuecomment-559606279,https://api.github.com/repos/pydata/xarray/issues/3582,559606279,MDEyOklzc3VlQ29tbWVudDU1OTYwNjI3OQ==,6213168,2019-11-28T21:32:23Z,2019-11-28T21:32:23Z,MEMBER,"I would not advise subclassing. In most cases it should work but it's thoroughly untested and I would be unsurprised if you were to find a use case that accidentally reverts your subclass to the base class. I don't think I fully understand your problem with accessors. Is it because you would need a hook that is triggered by ``DataArray. __init__``? Why can't you initialise whatever you need to upon first access? ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,530062582