zoukankan      html  css  js  c++  java
  • Python @property修饰器 解释

    Python @property修饰器

    基本用法

    必须使用@property,才可以使用@setter、@getter、@delete,否则报错

    @property(只读)

    @setter(设置)

    @getter(读取) (@property已经有读取的功能,不需要使用,使用则会调用@getter读取而不是@property下的方法)

    @delete(删除)

    代码1-1
    class classA():
        
        def __init__(self):
            self._name = 0
    
        @property
        def name(self): 
            print('property')
            return self._name
    
        @name.setter
        def name(self, name):
            print('name.setter')
            self._name = name
    
        @name.getter
        def name(self):
            print('name.getter')
            return self._name
    
        @name.deleter
        def name(self):
            print('name.deleter')
            del self._name
    
    a = classA()
    a.name = 1
    print(a.name)
    del a.name
    

    output:

    name.setter
    name.getter
    1
    name.deleter
    
    注:使用函数名自动调用函数。使用注释名@name.setter,我们执行a.name = 1,相当于调用@name.setter下的函数,并将等号后的值当为参数。
    可以像其他语言一样我们可以添加一个简单判断,来防止name属性出现不合适的值
    代码1-2
    @name.setter
    def name(self, name):
        print('name.setter')
        if not isinstance(name,str):
            raise ValueError('名字应该为字符')
            return
        self._name = name
    
    注:1.上述代码中 isinstance()是python官方文档推荐的判断属性属于哪一个类的函数。
    2. raise ValueError() 抛出一个错误。
    名称解释
    1. 有同学会问 代码1-1 中classA的属性是_name,为什么我操作的确是name,其name本质是一堆函数,需要一个外部变量来存储值,真_正的操作的对象其实是_name;
    2. 相信同学们注意到了如果classA有个成员属性正好叫name那怎么办,不要怀疑程序会报错;
    代码1-3
    @property
    def name(self):
    	pass
    @name.setter
    @name.getter
    @name.deleter
    

    又有同学注意到了,代码1-3 中类如setter前面的name到底有什么作用,如果单纯用函数写不也一样可以实现功能吗?

    python中的函数重载和别的语言中的不一样,遇到同名函数直接就新加载的替换老的同名函数,如果手动写的话,可就不可以使用,同名函数和使用函数名自动调用函数了。所以类如setter前面的name是为了区分函数,避免被覆盖。

  • 相关阅读:
    SysTick—系统定时器
    FreeRtos——单任务
    binutils工具集之---objdump
    对连接器的思考
    数组和指针并不相同
    typedef可以成为你的朋友
    gcc,一个神奇的编译器
    FreeRtos——移植
    Makefile 13——理解make的解析行为
    Makefile 12——改善编译效率
  • 原文地址:https://www.cnblogs.com/adamr/p/14117206.html
Copyright © 2011-2022 走看看