面向对象中的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 

结果如下

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

至此,[email protected],我们该如何调用了,那么大家难免还有一个疑问,这有什么卵用,不就是多一个括号少一个括号的问题,有必要搞那么复杂吗?仔细想一想,似乎真没有多大必要,[email protected]@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这个装饰器了

[email protected],装饰get_age这个方法,这里记住,[email protected],那就是self,[email protected]_age这个方法后,[email protected]_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) 

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

总结一下,在面向对象中,如果要设置一个属性,但是这个属性需要一些判断或者逻辑处理,[email protected] 这个装饰器,通过这个装饰器设置这个属性的值,然后在获取这个值

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

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/20791.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论