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__)

 

 

posted on 2017-12-24 14:35  纵情狂飞  阅读(418)  评论(0编辑  收藏  举报