栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python描述器的分类

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python描述器的分类

我们对于python描述器有所了解后,很多人知道有两种分类,在其中都涉及到了__get__方法的调用,在如何区分上还是遇到了难题。对象的属性有类属性和实例属性,那么非数据描述器只作用在类属性上。下面我们就python中非数据描述器和数据描述器分别带来介绍和代码示例。

1、非数据描述器

非数据描述器,只对类属性产生作用。当访问类属性时,将调用描述器的__get__方法。当非数据描述器是实例的变量时,实例访问非数据描述器不会调用__get__方法,只是访问了描述器类的实例。

# 示例
class Student1:
    def __init__(self):
        self.course = 'Python'
        print('Student1.__init__')
 
class Student2:
    stu1 = Student1()     # Student1()返回的是Student1类的实例
 
    def __init__(self):
        print('Student2.__init__')
 
print(Student2.stu1.course)
 
# 创建Student2的实例对象
stu2 = Student2()
print(stu2.stu1.course)
 
 
# 示例:引入描述器
class Stduent1:
    def __init__(self):
        self.course = 'Python'
        print('Stduent1.__init__')
 
    def __get__(self, instance, owner):
        print('self={} instance={} owner={}'.format(self, instance, owner))
 
class Stduent2:
    stu1 = Stduent1()
    def __init__(self):
        print('Stduent2.__init__')
 
print(Stduent2.stu1.course)
# Stduent2.stu1会访问Stduent1的实例,默认会调用__get__方法,但是__get__方法没有将实例返回,因此,Stduent2.stu1.course会报错
 
stu2 = Stduent2()
print(stu2.stu1.course)  # 一样的报错
 
 
# 示例 引入描述器
class Stduent1:
    def __init__(self):
        self.course = 'Python'
        print('Stduent1.__init__')
 
    def __get__(self, instance, owner):
        # 这里的self为Stduent1的实例. instance为实例, 如果是类访问,那么instance为None. owner是调用者的类
        print('self={} instance={} owner={}'.format(self, instance, owner))
        return self # 返回Student1的实例self
 
class Stduent2:
    stu1 = Stduent1()
    def __init__(self):
        print('Stduent2.__init__')
 
print(Stduent2.stu1.course)
 
stu2 = Stduent2()
print(stu2.stu1.course)

2、数据描述器

数据描述器,针对类属性和实例属性都产生作用。当访问或者修改此属性时,将调用相应的__get__或者__set__方法。

# 示例1:
class Student1:
    def __init__(self):
        self.course = 'Python'
        print('Student1.__init__')
 
    def __get__(self, instance, owner):
        # 这里的self为Student1的实例. instance为实例, 如果是类访问,那么instance为None. owner是调用者的类
        print('self={} instance={} owner={}'.format(self, instance, owner))
        return self   # 返回Student1的实例self
 
class Student2:
    stu1 = Student1()
 
    def __init__(self):
        print('Student2.__init__')
        self.y = Student1()   # 没有调用__get__方法
 
print(Student2.stu1.course)
 
stu2 = Student2()
print(stu2.y)
 
 
# 示例,数据描述器
class Student1:
    def __init__(self):
        self.course = 'Python'
        print('Student1.__init__')
 
    def __get__(self, instance, owner):
        print('self={} instance={} owner={}'.format(self, instance, owner))
        return self
 
    def __set__(self, instance, value):
        print('self={} instance={} value={}'.format(self, instance, value))
        self.course = value
 
class Student2:
    stu1 = Student1()
 
    def __init__(self):
        print('Student2.__init__')
        self.y = Student1()   # 调用了__get__方法
 
print(Student2.stu1.course)
 
stu2 = Student2()
print(stu2.stu1)

以上就是python描述器的分类详解,看完本篇的文章后,相信大家已经能够对描述器的类型进行区分。非数据描述器只作用类属性这点,大家一定不要忘记了哦。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/10772.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号