实现
1. property:将一些"属性的操作方法"关联到某一个属性中
(1) 在经典类中, 只能管理一个属性的读取操作
# _*_coding:utf-8_*_
class Person:
def __init__(self):
self.__age = 18
def get_age(self):
print "-----get"
return self.__age
def set_age(self, value):
print "-----set"
self.__age = value
age = property(get_age, set_age)
p = Person()
print p.age
p.age = 19
print p.age
print p.__dict__
# _*_coding:utf-8_*_
class Person:
def __init__(self):
self.__age = 18
@property
def age(self):
print "-----get"
return self.__age
@age.setter
def age(self, value):
print "-----set"
self.__age = value
p = Person()
print p.age
p.age = 20
print p.age
print p.__dict__
(2) 在新式类中, 可以管理一个属性的改查删操作
class Person(object):
def __init__(self):
self.__age = 18
def get_age(self):
print("-----, get")
return self.__age
def set_age(self, value):
print("-----, set")
self.__age = value
age = property(get_age, set_age)
p = Person()
print(p.age)
p.age = 20
print(p.age)
class Person(object):
def __init__(self):
self.__age = 18
@property
def age(self):
print("-----, get")
return self.__age
@age.setter
def age(self, value):
print("-----, set")
self.__age = value
p = Person()
print(p.age)
p.age = 20
print(p.age)
2. 借助系统内置的方法进行拦截
class Person:
"""
(1) 当我们通过"实例.属性 = 值", 给一个实例增加一个属性, 或者修改一下属性值的时候, 都会调用这个方法;
(2) 在这个方法内部, 才会真正地把这个属性, 以及对应的数据, 给存储到 __dict__ 字典里面
"""
def __setattr__(self, key, value):
print(key, value)
if key == "age" and key in self.__dict__.keys():
print("这个属性是只读属性, 不能设置数据")
else:
self.__dict__[key] = value
p = Person()
p.age = 18
print(p.age)
p.age = 20
print(p.age)
print(p.__dict__)