
- 问题描述
- 实现需求
- 类装饰器@property
- property()函数
- 在面向对象编程中,我们把方法看作对象的接口
- 直接访问对象的属性可能是不安全的,或在设计上不够灵活,但是使用调用方法在形式上不如直接访问属性简洁
- 如下举例:
# 调用方法(繁琐) # 获取数据 person.get_age() # 设置数据 person.set_age(18)
- 我们是否能实现在形式上是属性访问,但是实际上却是内部调用方法?保证即安全也简洁!!
- 定义类AgeDemo
- 通过访问器获取年龄
- 通过设置器设置年龄
- 年龄不是int类型则主动抛出异常
- 我们先来看看最基本的实现:
# 基本写法
class AgeDemo(object):
def __init__(self):
self.age = None
# 获取数据
def get_age(self):
return self.age
# 设置数据
def set_age(self, age):
if not isinstance(age, int):
raise TypeError('type error')
self.age = age
ycx = AgeDemo()
ycx.set_age(18) # 设置数据
print(ycx.get_age()) # 获取数据
- console输出:
- 下面就介绍两种方法来实现上述的目标!!
- 参数:
- fget – 获取属性值的函数
- fset – 设置属性值的函数
- fdel – 删除属性值函数
- doc – 属性描述信息
- 代码示例:
# 装饰器@property写法
class AgeDemo(object):
def __init__(self):
self.age = None
@property
def get_age(self):
return self.age
@property
def set_age(self, age):
if not isinstance(age, int):
raise TypeError('type error')
self.age = age
ycx = AgeDemo()
ycx.age = 18
print(ycx.age)
property()函数
- 参数列表:
class property([fget[, fset[, fdel[, doc]]]])
- 使用property()函数实现:
# property()函数写法
class AgeDemo(object):
def __init__(self):
self.age = None
def get_age(self):
return self.age
def set_age(self, age):
if not isinstance(age, int):
raise TypeError('type error')
self.age = age
Age = property(get_age, set_age)
ycx = AgeDemo()
ycx.Age = 18
print(ycx.Age)
- 上述的两种方法都可以实现创建可管理的对象属性!!!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)