zoukankan      html  css  js  c++  java
  • python property对象

    一、从@porperty说起

      Python内置的@property装饰器是负责把一个方法变成属性调用的

    class Stu(object):
        def __init__(self,age):
            self.__age=age
        @property    #直接调用属性
        def birth(self):
            return self._age
        @birth.setter   #设置属性
        def birth(self, value):
            self.__age = value
        @birth.deleter    #删除属性
        def birth(self):
            del self.__age
    
    #调用方法为
    stu_a = Stu(3)
    stu_a.birth  # >>> 3 调用@property修饰的方法
    stu_a.birth = 4   >>> 调用@setter修饰的方法
    del stu_a.birth   >>调用@deleter修饰的方法

    二、property类

    事实上property是一个类,里面封装了property,setter,deleter等方法,其中__init__()构造函数中,是存在4个参数的!

    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        pass

    这也就是property的另一种用法:property()

    class Stu(object):
        def __init__(self,age):
            self.__age=age
        def get_age(self):
            return self._age
        def set_age(self, value):
            self.__age = value
        def del_age(self):
            del self.__age
        gsd = property(get_age, set_age, del_age)
    
    stu1 = Stu(1)
    #调用方式:
    stu1.gsd
    stu1.gsd = 2
    del stu1.gsd 

    三、自己的@property

    @property其实就是通过描述符来定制,虽然内置方法为c封装的,但可以用python代码简单的实现@property的功能:

    class B:  # property对象
        def __init__(self, a):  # 这里传入的是aa方法
            self.a = func
    
        def __get__(self, instance, owner):
            ret = self.func(instance)   # instance为A的实例对象,即aa()函数需要的self
            return ret
    
    
    class A:
        @B   # B = B(aa)
        def aa(self):
            return "property"
    
    
    b = A()
    print(b.aa)   
  • 相关阅读:
    条件编译
    宏定义
    联合体,枚举类型
    结构体的概念
    C#程序报找不到时区错误
    C# ArrayList和List的区别
    C# 无法将类型为“__DynamicallyInvokableAttribute”的对象强制转换为类型...
    C# readonly与const区别
    C#特性
    Linux vsftpd 安装配置使用
  • 原文地址:https://www.cnblogs.com/yxi-liu/p/8361017.html
Copyright © 2011-2022 走看看