@property可以把一个实例方法变成其同名属性,以支持.号访问,它亦可标记设置限制,加以规范,如下代码:
class Animal(object):
def __init__(self, name, age):
self._name = name
self._age = age
self._color = 'Black'
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if isinstance(value, basestring):
self._name = value
else:
self._name = 'No name'
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value > 0 and value < 100:
self._age = value
else:
self._age = 0
# print 'invalid age value.'
@property
def color(self):
return self._color
@color.setter
def color(self, value):
self._color = value;
a = Animal('black dog', 3)
a.name = 'white dog'
a.age = 300
print 'Name:', a.name
print 'Age:', a.age
这样在设定值时候,总算有个判断取舍,是不是好一些?
私有变量以_开头,是种编码约写,当然也可以直接访问它。
不过既如此写,直接访问是不推荐的。
若真要为私有变量,则加双下划线,比如__name,也一样阻止不了访问,但让我们知道,它不想被直接用到,如下代码:
class Animal(object):
def __init__(self, name):
self.__name = name
a = Animal('black dog')
print a._Animal__name
property函数
它以一个函数形式,定义一个属性,与@property实现原理类似,或者就是它的的变异用法。
其原型为:
property(fget=None, fset=None, fdel=None, doc=None)
譬如上面Animal类,其可用此改为:
class Animal(object):
def __init__(self, name, age):
self._name = name
self._age = age
self._color = 'Black'
def get_name(self):
return self._name
def set_name(self, value):
if isinstance(value, basestring):
self._name = value
else:
self._name = 'No name'
name = property(fget=get_name, fset=set_name, fdel=None, doc='name of an animal')
def get_age(self):
return self._age
def set_age(self, value):
if value > 0 and value < 100:
self._age = value
else:
self._age = 0
# print 'invalid age value.'
age = property(fget=get_age, fset=set_age, fdel=None, doc='name of an animal')
a = Animal('black dog', 3)
a.name = 'white dog'
a.age = 3
print 'Name:', a.name
print Animal.name.__doc__
print 'Age:', a.age
其输出结果一样,看来只是写法不同。