- 问题描述
- 实现需求
- 类装饰器@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条)