Skip to content

Commit 1bafcc4

Browse files
adrianomartinellipre-commit-ci[bot]rusty1s
authored
Use class setter properties if present (#4682)
* add support for setter methods when Data is subclassed * test support of setters * run flake8 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * changelog Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: rusty1s <[email protected]>
1 parent 6cb12ea commit 1bafcc4

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
2323
- Added support for graph-level outputs in `to_hetero` ([#4582](https://github.com/pyg-team/pytorch_geometric/pull/4582))
2424
- Added `CHANGELOG.md` ([#4581](https://github.com/pyg-team/pytorch_geometric/pull/4581))
2525
### Changed
26+
- Allow for `setter` properties in `Data` and `HeteroData` ([#4682](https://github.com/pyg-team/pytorch_geometric/pull/4682))
2627
- Allow for optional `edge_weight` in `GCN2Conv` ([#4670](https://github.com/pyg-team/pytorch_geometric/pull/4670))
2728
- Fixed the interplay between `TUDataset` and `pre_transform` that modify node features ([#4669](https://github.com/pyg-team/pytorch_geometric/pull/4669))
2829
- Make use of the `pyg_sphinx_theme` documentation template ([#4664](https://github.com/pyg-team/pyg-lib/pull/4664), [#4667](https://github.com/pyg-team/pyg-lib/pull/4667))

test/data/test_data.py

+26
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,29 @@ def test_data_share_memory():
213213
for data in data_list:
214214
assert data.x.is_shared()
215215
assert torch.allclose(data.x, torch.full((8, ), 4.))
216+
217+
218+
def test_data_setter_properties():
219+
class MyData(Data):
220+
def __init__(self):
221+
super().__init__()
222+
self.my_attr1 = 1
223+
self.my_attr2 = 2
224+
225+
@property
226+
def my_attr1(self):
227+
return self._my_attr1
228+
229+
@my_attr1.setter
230+
def my_attr1(self, value):
231+
self._my_attr1 = value
232+
233+
data = MyData()
234+
assert data.my_attr2 == 2
235+
236+
assert 'my_attr1' not in data._store
237+
assert data.my_attr1 == 1
238+
239+
data.my_attr1 = 2
240+
assert 'my_attr1' not in data._store
241+
assert data.my_attr1 == 2

torch_geometric/data/data.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,11 @@ def __getattr__(self, key: str) -> Any:
375375
return getattr(self._store, key)
376376

377377
def __setattr__(self, key: str, value: Any):
378-
setattr(self._store, key, value)
378+
propobj = getattr(self.__class__, key, None)
379+
if propobj is None or propobj.fset is None:
380+
setattr(self._store, key, value)
381+
else:
382+
propobj.fset(self, value)
379383

380384
def __delattr__(self, key: str):
381385
delattr(self._store, key)

0 commit comments

Comments
 (0)