python描述符很难_Python中的描述符

解答三个问题,描述是什么?如何实现?使用场景?

一、什么是描述符

描述符就是一个具有绑定行为的对象属性,其属性访问将由描述符协议中的方法覆盖。这些方法为 __get__、__set__ 和 __delete__。如果这些方法中的任何一个针对某个对象定义,那么它就被认为是一个描述符。

__get__ 用于访问属性。它返回属性的值,或者在所请求的属性不存在的情况下出现 AttributeError 异常

__set__ 将在属性分配操作中调用。不会返回任何内容

__delete__ 控制删除操作。不会返回内容

二、描述符的实现方式

2.1 基于类创建

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# __author__ = 'liao gao xiang'

class Descriptor(object):

""""""

def __init__(self):

self._name = ''

def __get__(self, instance, owner):

print("__get__")

return self._name

def __set__(self, instance, value):

print("__set__")

self._name = value

def __delete__(self, instance):

print("__delete__")

del self._name

class Person(object):

name = Descriptor()

p = Person()

print(p.name)

p.name = 'liao gao xiang'

del p.name

# print(p.name)

2.2 使用propety()函数

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# __author__ = 'liao gao xiang'

class Person(object):

def __init__(self):

self._name = ''

def fget(self):

print("Getting: %s" % self._name)

return self._name

def fset(self, value):

print("Setting: %s" % value)

self._name = value.title()

def fdel(self):

print("Deleting: %s" % self._name)

del self._name

name = property(fget, fset, fdel, "I'm the property.")

p = Person()

print(p.name)

p.name = 'liao gao xiang'

del p.name

# print(p.name)

2.3 使用@property装饰器

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# __author__ = 'liao gao xiang'

class Person(object):

""""""

def __init__(self, name):

self._name = name

@property

def name(self):

print("get_name")

return self._name

@name.setter

def name(self, value):

print("set_name")

self._name = value

@name.deleter

def name(self):

print("del_name")

del self._name

p = Person()

print(p.name)

p.name = 'liao gao xiang'

del p.name

# print(p.name)

三、描述符的使用场景

通过结合使用描述符,可以实现优雅的编程,允许创建 Setters 和 Getters 以及只读属性

根据值或类型请求进行属性验证

大量用于各种框架中,比如Django的models

搜索关注微信公众号:寸土币争 ID: bbcoins

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值