考察下面这个简单的例子:
class Person(object):
def __init__(self):
self._name = None
def get_name(self): # 这是方法
if not self._name:
raise RuntimeError('no name')
return self._name
def set_name(self, name): # 这还是方法
if not name:
raise ValueError('name should not be empty')
self._name = name
# 定义了名为 name 的属性
name = property(get_name, set_name)
我们可以使用方法或属性来操作:
>>> p = Person()
>>> p.name
...
RuntimeError: no name
可以看到用属性的方式访问,还是调用了 get_name() 方法,这和:
>>> p.get_name()
...
RuntimeError: no name
是一样的。同样,我们使用方法和属性两种方式操作:
>>> p.name = 'mike'
>>> p.get_name()
'mike'
>>> p.name
'mike'
>>> p.name = 'peter'
>>> p.name
'peter'
>>> p.name = ''
...
ValueError: name should not be empt
可以看到,实际上为 p.name 赋值时,调用了 set_name() 方法。