Skip to content

Instantly share code, notes, and snippets.

@cynthia
Created August 30, 2017 07:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cynthia/2e68f3f1e8c625cef81e2ef5eaf49360 to your computer and use it in GitHub Desktop.
Save cynthia/2e68f3f1e8c625cef81e2ef5eaf49360 to your computer and use it in GitHub Desktop.
# Simple (?) example of descriptor use in Python.
class FullName():
def __get__(self, i, o):
return '%s %s' % (i.first_name, i.last_name)
class LastName():
def __get__(self, i, o):
if i.married and i.gender == Person.female and i.spouse is not None:
return i.spouse.text_last_name
return i.text_last_name
class Person():
male = 1
female = 2
last_name = LastName()
def __init__(self, first_name, last_name, gender, married, spouse):
self.first_name = first_name
self.text_last_name = last_name
self.gender = gender
self.married = married
self.spouse = spouse
if spouse is not None:
spouse.spouse = self
def marry(spouse):
# Let's assume same-sex marriage is cool.
# and people don't change surnames in a same-sex marriage.
self.married = True
self.spouse = spouse
# FIXME: This won't work in countries that support polygamy.
self.spouse.spouse = self
def divorce():
self.married = False
# FIXME: This won't work in countries that support polygamy.
self.spouse.spouse = None
self.spouse = None
# In [163]: jd = Person("John", "Doe", Person.male, True, None)
#
# In [164]: jf = Person("Jane", "Fonda", Person.female, True, jd)
#
# In [165]: jf.name
# Out[165]: 'Jane Doe'
#
# In [166]: jf.divorce()
#
# In [167]: jf.name
# Out[167]: 'Jane Fonda'
#
# In [168]: jf.marry(jd)
#
# In [169]: jf.name
# Out[169]: 'Jane Doe'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment