Creating Managed Attributes
Problem
You want to add extra processing (e.g., type checking or validation) to the getting or setting of an instance attribute.
Solution
A simple way to customize access to an attribute is to define it as a “property.” For example, this code defines a property that adds simple type checking to an attribute:
class
Person
(
object
):
def
__init__
(
self
,
first_name
):
self
.
first_name
=
first_name
# Getter function
@property
def
first_name
(
self
):
return
self
.
_first_name
# Setter function
@first_name
.
setter
def
first_name
(
self
,
value
):
if
not
isinstance
(
value
,
str
):
raise
TypeError
(
'Expected a string'
)
self
.
_first_name
=
value
# Deleter function (optional)
@first_name
.
deleter
def
first_name
(
self
):
raise
AttributeError
(
"Can't delete attribute"
)
In the preceding code, there are three related methods, all of which must
have the same name. The first method is a getter function and
establishes first_name
as a property. The other two methods
attach optional setter and deleter functions to the first_name
property. It’s important to stress that the @first_name.setter
and
@first_name.deleter
decorators won’t be defined unless first_name
was already established as a property using @property
.
A critical feature of a property is that it looks like a normal attribute, but access automatically ...
Get Creating Managed Attributes now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.