zoukankan      html  css  js  c++  java
  • DAY 150 setter&getter&@property

    1. 解释setter和getter的使用方法
    2. 解释@property装饰器的妙用

      在python中,setter和getter方法并不像其它编程语言中的那样。基本上,在面向对象编程语言中,使用setter和getter方法的主要目的是为了确保数据的封装。不像其它面向对象编程语言,python中的私有变量并不是真正的隐藏字段。在python中,通常在以下情况会用到setter和getter方法:

    • 在获取或者设置属性值的时候使用setter和getter方法为其添加验证逻辑
    • 避免对类的某些字段直接访问,比如类的私有变量不应该被外部调用者直击访问或者修改

    使用普通函数实现setter和getter方法
    要实现setter和getter属性,只是定义普通方法get()和set()并不能反产生任何特殊的行为,例如:

    class Student(object):
        def __int(self, age=0):
            self._age = age
        
        # getter方法
        def get(self):
            return self._age
        
        # setter方法
        def set(self, value):
            self._age = value
            
    xiaoming = Student()
    # 使用setter方法设置age
    xiaoming.set(20)
    # 使用getter方法返回age
    print(xiaoming.get())
    print(xiaoming._age)

    输出:

    20
    20

    在上面代码中,set_age()和get_age()方法与普通方法并没有什么两样,那么如何实现像getter和setter一样的功能呢?这就要用到python中的特殊方法property()。

    使用property()方法来实现setter和getter的行为
    property()是python中的一个内置方法,它创建并返回一个属性对象。一个属性对象有三个方法,getter()、setter()和delete()。property()内置方法有四个参数,property(fget,fset, fdel, doc)。fget是一个用于获取属性值的函数,fset是一个用于设置属性值的函数,fdel是一个用于删除属性的函数,doc用于为属性创建文档说明。一个属性兑现有三个方法,getter()、setter()和delete()分别制定fget、fset、fdel。

    class Adult(object):
        def __int(self):
            self.__age = 0
        
        # 获取属性_age的值
        def get_age(self):
            print('getter() method called')
            return self.__age
        
        # 设置属性_age的值
        def set_age(self, value):
            print('setter() method called')
            self.__age = value
        
        # 删除属性_age
        def del_age(self):
            del self.__age
            
        age = property(get_age, set_age, del_age)
    
    laowang = Adult()
    laowang.age = 60
    print(laowang.age)

    输出:

    setter() method called
    getter() method called
    60

    在上面的代码中,age就是一个属性对象,它保证了对私有变量的安全访问。

    使用@property装饰器来实现setter和getter的行为
    除了上面使用property()的方法来实现getter、setter方法的行为,在python中还可以装饰器@property来实现。@property是python的一个内置装饰器,使用装饰器的目的是改变类的方法或者属性,这样调用者就无需在代码中做任何改动。

    class Adult(object):    
        def __init__(self):
            self.__age = 0
        
        @property
        def age(self):
            print('getter() method called')
            return self.__age
            
        @age.setter
        def age(self, value):
            if value < 18:
                raise ValueError('Sorry, you are a child, games not allowed')
            print('setter() method called')
            self.__age = value
            
    xiaoli = Adult()
    xiaoli.age = 19
    print(xiaoli.age)

    输出:

    setter() method called
    getter() method called
    19

    上面的代码清晰地展示了如何用pythonic的方式使用@property装饰器实现setter和getter属性。同时实现了对属性赋值时的有效性检查。

  • 相关阅读:
    想用Nginx代理一切?行!
    [SuProxy]Ngnix+Lua 实现SSH2,LDAP,ORACLE,SQLSERVER等TCP/IP协议分析,劫持,代理,会话及负载
    hive分区表详细介绍
    hive 中自定义UDF函数和自定义UDTF函数
    yarn工作原理
    HDFS小文件问题
    HDFS读写流程
    利用 canvas 实现签名效果
    idea里面自带的翻译插件
    idea的set,get插件
  • 原文地址:https://www.cnblogs.com/DEJAVU888/p/14991567.html
Copyright © 2011-2022 走看看