zoukankan      html  css  js  c++  java
  • 面向对象中的property装饰器讲解

    面向对象中可以用property来修饰我们的函数,必须下面的例子

    class Test(object):
        def __init__(self,name):
            self.name = name
    
        @property
        def run(self):
            print(self.name)
    
    
        def talk(self):
            print(self.name)
    

    使用property修饰有什么效果的,他会把一个类的方法变成了一个类的属性,这样,我们调用的run这个方法的时候,就像直接调用属性一样调用,不需要再像调用方法一样加一个括号,相反,如果你加了括号去调用,反而会报错

    下面的例子,我们实例出来一个对象,分别调用run和talk

    if __name__ == '__main__':
    
        t = Test("中国是个大傻逼")
        t.talk()
    
        t.run
    

    结果如下

    中国是个大傻逼
    中国是个大傻逼
    

    至此,我们知道如果一个类的方法被@property修饰后,我们该如何调用了,那么大家难免还有一个疑问,这有什么卵用,不就是多一个括号少一个括号的问题,有必要搞那么复杂吗?仔细想一想,似乎真没有多大必要,你用@property修饰和不用@propery修饰,真没什么区别,但是大家看下下面的场景

    我写了一个这样的类

    class Test_property(object):
        def __init__(self):
            pass
    
    
        def get_age(self):
            return self._age
    
    
        def set_age(self,age):
            if age >= 100:
                raise ValueError("年龄不能大于100")
            elif age < 1:
                raise ValueError("年龄不能小于1")
            else:
                self._age = age
    

    比如我们定义一个属性,没有办法去控制这个属性的值,比如我们上面的例子,如果我们在构造方法init中直接设置年龄的话,那么如果用户设置了一个1000岁,这个明显就不符合常理,所以要把设置年龄这个属性修改为方法,这样我们就可以在方法中做各种的控制,但是这个方法又不大不小,按照我们的使用习惯,肯定还是设置属性的方式去设置年龄更加的符合操作系统,这个时候,我们就可以用到property这个装饰器了

    我们首先使用@property这个装饰器,装饰get_age这个方法,这里记住,使用@propery这个装饰器装饰的方法只能有一个参数,那就是self,当前我们用@propery这个装饰器装饰了get_age这个方法后,python就会自动为我们生产一个@get_age.setter的装饰器,这个装饰器,同样也是把一个方法变成了一个属性,但是他可以传递参数,必须下面的例子

    class Test_property(object):
        def __init__(self):
            pass
    
        @property
        def get_age(self):
            return self._age
    
        @get_age.setter
        def set_age(self,age):
            if age >= 100:
                raise ValueError("年龄不能大于100")
            elif age < 1:
                raise ValueError("年龄不能小于1")
            else:
                self._age = age
    
    
    
    if __name__ == '__main__':
    
        t = Test_property()
    
        t.set_age=101
    
        print(t.get_age)
    

    这样,我们即可用通过调用属性的方式去调用方法,也可以实现各种逻辑判断

    总结一下,在面向对象中,如果要设置一个属性,但是这个属性需要一些判断或者逻辑处理,那么就需要用到@propery 这个装饰器,通过这个装饰器设置这个属性的值,然后在获取这个值

    至此,@property这个装饰器我们就讲完了。不知道大家是否掌握了。

  • 相关阅读:
    洛谷P1306 斐波那契公约数
    Codevs 1688 求逆序对(权值线段树)
    poj1006 Biorhythms
    2017-9-2 NOIP模拟赛
    洛谷P1633 二进制
    洛谷P2513 [HAOI2009]逆序对数列
    洛谷P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower
    洛谷P2285 [HNOI2004]打鼹鼠
    2017-8-31 NOIP模拟赛
    洛谷P2134 百日旅行
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/9950607.html
Copyright © 2011-2022 走看看