Search code examples
pythonpython-3.7python-dataclasses

Dataclasses and property decorator


I've been reading up on Python 3.7's dataclass as an alternative to namedtuples (what I typically use when having to group data in a structure). I was wondering if dataclass is compatible with the property decorator to define getter and setter functions for the data elements of the dataclass. If so, is this described somewhere? Or are there examples available?


Solution

  • It sure does work:

    from dataclasses import dataclass
    
    @dataclass
    class Test:
        _name: str="schbell"
    
        @property
        def name(self) -> str:
            return self._name
    
        @name.setter
        def name(self, v: str) -> None:
            self._name = v
    
    t = Test()
    print(t.name) # schbell
    t.name = "flirp"
    print(t.name) # flirp
    print(t) # Test(_name='flirp')
    

    In fact, why should it not? In the end, what you get is just a good old class, derived from type:

    print(type(t)) # <class '__main__.Test'>
    print(type(Test)) # <class 'type'>
    

    Maybe that's why properties are nowhere mentioned specifically. However, the PEP-557's Abstract mentions the general usability of well-known Python class features:

    Because Data Classes use normal class definition syntax, you are free to use inheritance, metaclasses, docstrings, user-defined methods, class factories, and other Python class features.