过去已去,未来已来

  • 主页
  • 友链
过去已去,未来已来
  1. 首页
  2. python学习
  3. 正文

浅谈python中的property属性演变过程

2022年3月12日 270点热度 2人点赞 0条评论

property属性可以用来给属性添加约束,保护数据在有效范围内;使用property属性,将来修改约束条件的时候也很方便,可以在代码的调用方式不变的情况下改变结果。

例子:对于学生类有两个实例变量,一个是姓名,一个是年龄;对学生的年龄加以约束,将学生的年龄控制在6-18岁之间,倘若创建的学生对象的年龄不在6-18岁之间,则不接收该学生;

实现方法1:

class Student:
    def __init__(self, name="", age=0):
        self.name = name
        self.__age = age
   
    def get_age(self):# 读取
        return self.__age

    def set_age(self,value):# 写入
        if 6<=value<=18:
            self.__age = value
        else:
            raise Exception("年纪过大,不接收该学生")

zs = Student("张三", 800)
zs.set_age(20)
print(zs.get_age())

如上述代码所示:首先将年龄实例变量,私有化,即self.__age = age,类外部则无法访问该实例变量;其次创建两个函数,分别为读取和写入函数:其中读取函数,自动返回年龄的数据值;写入函数,若写入的值不在6-18之间,则不接收该学生,若在6-18之间,则将其数值赋值给年龄实例变量;注意事项:实例变量私有化后的读取和写入,无法通过对象.age或对象.__age访问或修改,需通过函数get_age读取,set_age函数写入;
上述代码的缺陷:在创建对象初始化过程中,并不会对年龄进行判断,而是直接赋值;因此即使年龄不在接收范围内,该学生也会被接收;

实现方法2:

class Student:
    def __init__(self, name="", age=0):
        self.name = name
        self.set_age(age)

    def get_age(self):# 读取
        return self.__age

    def set_age(self,value):# 写入
        if 6<=value<=18:
            self.__age = value
        else:
            raise Exception("年纪过大,不接收该学生")

zs = Student("张三", 800)
zs.set_age(20)
print(zs.get_age())

为解决实现方法1中的缺陷,在类初始化过程中,直接让其进入写入年龄函数进行判断:self.set_age(age);注意:此时age实例变量是私有化变量;且zs.age=15并不报错,但并不会将15写入年龄,只能用set_age函数进行写入操作;
上述代码缺陷:在初始化函数中,出现self.set_age(age)这种代码,显得不是那么整齐,但Java语言中是利用这种方法实现的;

实现方法3:

class Student:
    def __init__(self, name="", age=0):
        self.name = name
        self.age = age

    def get_age(self):# 读取
        return self.__age

    def set_age(self,value):# 写入
        if 6 <= value <= 18:
            self.__age = value
        else:
            raise Exception("年纪过大,不接收该学生")

    # 创建与实例变量名称相同的类变量
    age = property(get_age,set_age)

zs= Student("张三", 15)
zs.age = 10 # zs.set_age(20)
print(zs.age)

通过创建与实例变量名称相同的类变量实现此功能:age = property(get_age,set_age);在初始化过程中执行该条self.age = age会自动跳至set_age函数进行写入操作,并且实际存储数据的是私有化变量age;但此时可以通过对象.age对age进行读写操作;

实现方法4:

class Student:
    def __init__(self, name="", age=0):
        self.name = name
        self.age = age

    @property  # age = property(age)
    def age(self):
        return self.__age

    @age.setter  # age = age.setter(age)
    def age(self, value):
        if 6<=value<=18:
            self.__age = value
        else:
            raise Exception("年纪过大,不接收该学生")

zs = Student("张三", 18)
zs.age = 10
print(zs.age)

上述代码即常规使用办法,前三种是演变过程;该规范代码记住即可,或者使用快捷键props+回车即可调出框架;

标签: python学习
最后更新:2022年3月12日

恩佩

严于律己,宽以待人

点赞

文章评论

取消回复

恩佩

严于律己,宽以待人

标签聚合
LabVIEW 高等数学 python学习 iPhone&iPad
最新 热点 随机
最新 热点 随机
浅谈python中的property属性演变过程 高数竞赛书籍推荐 iPad&iPhone快截指令 LABVIEW学习分享 高效学习高等数学必备
iPad&iPhone快截指令 浅谈python中的property属性演变过程 LABVIEW学习分享 高效学习高等数学必备 高数竞赛书籍推荐

COPYRIGHT © 2021 zhouenpei0523.top. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

苏ICP备20012291号