Python3 property属性

发布时间:2019-09-28 08:39:10编辑:auto阅读(1862)

    python3中的property有一个很有意思的功能,它能将类中的方法像类属性一样调用!

    class property(fget=None, fset=None, fdel=None, doc=None)

    我们先来简单了解一下这个property类,下面看一下官网给出的例子:

    class C:
        def __init__(self):
            self._x = None
    
        def getx(self):
            return self._x
    
        def setx(self, value):
            self._x = value
    
        def delx(self):
            del self._x
    
        x = property(getx, setx, delx, "I'm the 'x' property.")  # 这里的x相当于类属性
        
    c = C()  # 生成一个对象
    c.x = 10  # 设置self._x=10,实际调用的就是类中setx方法
    c.x  # 获取self._x的值,实际调用的就是类中getx方法
    del c.x  # 删除self._x的值,实际调用的就是类中delx方法

        是不是感觉很有意思,很不可思议!property中fget是一个函数,它获取属性值;fset是一个函数,它设置一个属性值;fdel是一个函数,它删除一个属性值;doc为该属性创建一个docstring。你只要在使用时在对应的形参位置放上你写的对应函数,就可以轻松使用了。


    我们还可以将property作为装饰器来使用,还是使用官网的例子:

    class C:
        def __init__(self):
            self._x = None
    
        @property
        def x(self):
            """I'm the 'x' property."""
            return self._x
    
        @x.setter
        def x(self, value):
            self._x = value
    
        @x.deleter
        def x(self):
            del self._x

        property对象有getter、setter、deleter三个方法,getter获取属性值,setter设置属性值,deleter设置属性值,这个例子的效果跟上一个例子的效果完全相同!我们看到里面的方法名是一模一样的,但是达到的效果却是不同的。第一个x方法是获取属性值,第二个x方法是设置属性值,第三个x方法是删除属性值。

        你看到这里是不是以为这一切都是property帮你做到的,错,错,错!其实property只做了一件事件,它将你的方法能像类属性一样使用,至于里面的查、删、改,其实都是你自己写的函数实现的!fget、fset、fdel、setter、deleter这些仅仅只是名字而且,方便你识别,其他什么作用都没有!

    我们来看一下property的源代码:

    class property(object):
        """
        property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
        
        fget is a function to be used for getting an attribute value, and likewise
        fset is a function for setting, and fdel a function for del'ing, an
        attribute.  Typical use is to define a managed attribute x:
        
        class C(object):
            def getx(self): return self._x
            def setx(self, value): self._x = value
            def delx(self): del self._x
            x = property(getx, setx, delx, "I'm the 'x' property.")
        
        Decorators make defining new properties or modifying existing ones easy:
        
        class C(object):
            @property
            def x(self):
                "I am the 'x' property."
                return self._x
            @x.setter
            def x(self, value):
                self._x = value
            @x.deleter
            def x(self):
                del self._x
        """
        def deleter(self, *args, **kwargs): # real signature unknown
            """ Descriptor to change the deleter on a property. """
            pass
    
        def getter(self, *args, **kwargs): # real signature unknown
            """ Descriptor to change the getter on a property. """
            pass
    
        def setter(self, *args, **kwargs): # real signature unknown
            """ Descriptor to change the setter on a property. """
            pass
    
        def __delete__(self, *args, **kwargs): # real signature unknown
            """ Delete an attribute of instance. """
            pass
    
        def __getattribute__(self, *args, **kwargs): # real signature unknown
            """ Return getattr(self, name). """
            pass
    
        def __get__(self, *args, **kwargs): # real signature unknown
            """ Return an attribute of instance, which is of type owner. """
            pass
    
        def __init__(self, fget=None, fset=None, fdel=None, doc=None): # known special case of property.__init__
            """
            property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
            
            fget is a function to be used for getting an attribute value, and likewise
            fset is a function for setting, and fdel a function for del'ing, an
            attribute.  Typical use is to define a managed attribute x:
            
            class C(object):
                def getx(self): return self._x
                def setx(self, value): self._x = value
                def delx(self): del self._x
                x = property(getx, setx, delx, "I'm the 'x' property.")
            
            Decorators make defining new properties or modifying existing ones easy:
            
            class C(object):
                @property
                def x(self):
                    "I am the 'x' property."
                    return self._x
                @x.setter
                def x(self, value):
                    self._x = value
                @x.deleter
                def x(self):
                    del self._x
            
            # (copied from class doc)
            """
            pass
    
        @staticmethod # known case of __new__
        def __new__(*args, **kwargs): # real signature unknown
            """ Create and return a new object.  See help(type) for accurate signature. """
            pass
    
        def __set__(self, *args, **kwargs): # real signature unknown
            """ Set an attribute of instance to value. """
            pass
    
        fdel = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
    
        fget = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
    
        fset = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
    
        __isabstractmethod__ = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default

        看到上面的源代码恍然大悟没,fdel、fget、fset都只是执行你函数里面的代码而已!所以我们就记住一句话就够了:“property能让你的方法像类属性一样使用”。



关键字

上一篇: Python3目录操作

下一篇: python3学习(1)