python 创建可管理的属性-property使用

对实例属性的获取和访问,我们希望增加一些额外的处理过程,比如说检查类型或者验证。
要定义对属性的访问,一种简单的方式是将其定义为property。

传统方法
class Person(object):
    def __init__(self, age):
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if not isinstance(age, int) or age < 0:
            raise ValueError("age ust be int")
        self.__age = age

c = Person(100)
print(c.age)  # 报错 不能这样访问
print(c.get_age())  # 100,访问方式比较繁琐
方法一(已经存在get和set方法的 + )
class Person1(object):
    def __init__(self, age):
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if not isinstance(age, int) or age < 0:
            raise ValueError("age ust be int")
        self.__age = age

    # 增加这一句
    age = property(get_age, set_age)

a = Person1(100)
print(a.age)  # 100 可以直接访问,不用调用方法
print(a.get_age()) # 100 这样调用方法也可以访问
a.age = 9
print(a.age)  # 9
方法二
class Person2(object):
    def __init__(self, age):
        self.__age = age

    @property  # 增加property装饰器
    def age(self):
        return self.__age

    @age.setter  # 增加age.setter装饰器
    def age(self, age):
        if not isinstance(age, int) or age < 0:
            raise ValueError("age ust be int")
        self.__age = age

# 注意使用这种方法的时候,都是使用age方法
a = Person2(100)
print(a.age)  # 100
a.age = 88
print(a.age)  # 88
a.age = -8
print(a.age)  # 报错
property也可以用来定义需要计算的属性,这类属性并不会实际保存起来,二时根据需要完成计算
import math
class Circle:
    def __init__(self, radius):
        self.radius = radius

    @property
    def area(self):
        return math.pi * self.radius ** 2

    @property
    def perimeter(self):
        return 2 * math.pi * self.radius


c1 = Circle(5)
print(c1.radius)
print(c1.area)
print(c1.perimeter)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,831评论 2 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,136评论 1 32
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,123评论 6 13
  • 一源温水荡心底,残花起,南山雪化暖阳里,冬水泠泠染红旗。 千载古佛桃花洗,人间俗情终欲迷。下山去,青竹摇曳,碎花雨...
    圣海乾坤阅读 222评论 0 0