zoukankan      html  css  js  c++  java
  • Python(5)——关于描述符的三种操作方法

    python中的描述符是用于描述对象中的属性。主要作用就是对属性操作提供限制,验证,管理等相关权限的操作。

    描述符主要有三种操作需要设置:

    get      获取属性的操作
    
    set      设置属性的操作
    
    delete   删除属性的操

    描述符方法一
    #描述符类
    class Description:
        #成员属性
        #name = ''
    
        #初始化方法
        def __init__(self):
            #为当前类/对象添加一个成员属性(当前类)来接收需要描述的成员属性(要描述的类)此处还没有接收(占位)
            self.name = None
    
        #get获取属性值的方法
        def __get__(self,obj,cls):# self 用于接收当前描述符类的对象 obj 接收用于管理的成员的对象  cls 用于接收管理成员的类
            print('获取方法被触发')
            self.name = str(self.name)
            return self.name[:4]
    
        #set设置属性值的方法
        def __set__(self,obj,val): #self 用于接收当前描述符类的对象 obj 接收用于管理的成员的对象 val 设置的值
            print('设置方法被触发')
            #print(self,obj,val)
            #在此处可以添加限制和判断(密码奇数时*2)
            if val %2 == 1:
                val *= 2
            #完成了(email)对象的属性值的设置
            self.name = val
    
        #delete删除属性值的方法
        def __delete__(self,obj): #self当前描述符类的对象 obj 接收用于管理的成员的对象
    
            #用户代为删除操作
            del self.name
    
    #声明一个邮箱的类
    class Email
        #属性
    
        #用户名
        account = 'conghao@zhiling.com'
        #密码(为密码设置了描述符 的对象) 这一步相当于吧password的所有传入了Description的对象当中
        password = Description()

    描述符方法2

    #邮箱类
    class Email:
    
        #成员属性
        #为username添加描述符
        #username = ''
        #设置邮箱账号最大的长度
        maxlength = 6
        #为描述符添加一个临时变量(在描述符中代替username进行操作)
        tmpusername = None    
        password = ''
    
        #成员方法
        #为username的描述符进行设置(添加方法)
        #获取username的描述符方法
        def getusername(self):
            print('获取操作被触发')
            #返回值之前进行值的修饰,两边添加星星
            if self.tmpusername != None:
                self.tmpusername = '' + self.tmpusername + ''
            #设置获取username的时候的值
            return self.tmpusername
    
        #设置username的描述符方法
        def setusername(self,val):
            print('设置操作被触发')
            #限制,根据Email类的最大账号长度对用户名进行截取之后在设置
            #检测val是否是字符串类型
            if isinstance(val,str):
                val = val[0:self.maxlength]
            self.tmpusername = val
    
        #删除username的描述符方法
        def delusername(self):
            print('删除操作被触发')
            #删除操作
            del self.tmpusername
    
        #为username设置描述符
        username = property(getusername,setusername,delusername)

    描述符方法3(属性修饰符)

    #邮箱类
    class Email:
    
        #用户名
        username = ''
        #密码
        password = ''
        #使用描述符来操作昵称
        #昵称
        petname = '小乖乖'
        #为描述符设置临时变量
        __petname = None
    
        #成员方法(暂无)
        #描述符设置的三个部分  获取,设置和删除
        #处理petname获取操作
        @property
        def petname(self):
            print('获取操作被触发')
            return self.__petname
    
        #处理petname的设置操作
        @petname.setter
        def petname(self,val):
            print('设置操作被触发')
            #设置操作
            self.__petname = val
    
        #处理petname的删除操作
        @petname.deleter
        def petname(self):
            print('删除操作被触发')
            #删除操作
            del self.__petname

    #常用内置属性

    #__dict__查看类和对象所属成员

    class Animal:
        name = 'xixi'
        age = 3
        sex = ''
    
        def tiao(self):
            print('jump~~')
    
        def __init__(self):
            self.color = 'white'
    
    print(Animal.__dict__)
    
    xx = Animal()
    print(xx.__dict__)

    #__doc__查看类文档

    class LYB:
        '''
        这是一种修养
    
        '''
    
    print(LYB.__doc__)

    #__name__获取当前类名

    class Dog:
    def jiao(self):
    print(Dog.__name__)
    
    #
    Dog.jiao(1)
    
    #对象
    gou = Dog()
    gou.jiao()


    #__bases__获取类的继承列表

    class BaBa:
    pass
    class MaMa:
    pass
    
    class Son(MaMa,BaBa):
    pass
    
    print(Son.__bases__)
     
  • 相关阅读:
    字体图标
    css精灵图
    css定位
    浮动的清除
    浮动、版心布局
    css 盒子模型
    css三大特性、行高属性、权重
    JSP实现上传文件(或图片)到MySQL
    MySQL 错误. Packet for query is too large (***> 4194304). You can change......
    使用Servlet3.0提供的API实现文件上传到指定位置
  • 原文地址:https://www.cnblogs.com/w-yumiao/p/8098017.html
Copyright © 2011-2022 走看看