python tips:描述符descriptor
2020-12-13 03:40
标签:ati str 输出 选择 from 类方法 == 进一步 方式 描述符(descriptor)是实现了 描述符在类的属性调用中起着很重要的作用,类在调用属性时,遵守两个规则: 从上述两个例子中可以看到,类 静态方法与类方法统一了类属性的两种引用方式。这种统一的过程可以使用描述符修改属性访问的默认方式实现。静态方法限制实例的默认绑定,将方法当做普通函数使用;类方法始终将类作为第一个参数传入,上述的 python tips:描述符descriptor 标签:ati str 输出 选择 from 类方法 == 进一步 方式 原文地址:https://www.cnblogs.com/luoheng23/p/11083398.html__get__
、__set__
、__del__
方法的类,进一步可以细分为两类:
__get__
和__set__
__set__
非数据描述符会被实例属性覆盖
class A:
def __get__(self, obj, cls):
return f"{obj}: get"
class B:
value = A()
def __init__(self):
self.value = 4
def main():
g = B()
print(g.value)
print(g.__dict__)
if __name__ == "__main__":
main()
输出结果
4
{'value': 4}
数据描述符优于实例属性
class A:
def __get__(self, obj, cls):
return f"{obj}: get"
def __set__(self, obj, value):
print(f"{obj}: set, {value}")
class B:
value = A()
def __init__(self):
self.value = 4
def main():
g = B()
print(g.value)
print(g.__dict__)
if __name__ == "__main__":
main()
输出结果
<__main__.b object at>: set, 4
<__main__.b object at>: get
{}
B
的value
属性是一个描述符,当value
属性是一个数据描述符时,它屏蔽了实例的同名属性value
,实例对value
属性的读取与赋值都会直接被转移到类属性value
上。使用描述符实现类的静态方法与类方法
from functools import partial
class Staticmethod:
def __init__(self, method):
self.method = method
def __get__(self, obj, cls):
return self.method
class Classmethod:
def __init__(self, method):
self.method = method
def __get__(self, obj, cls):
return partial(self.method, cls)
class A:
@Staticmethod
def f(self):
print(f"I'm method f, the value is {self}")
@Classmethod
def c(self):
print(f"my class is {self}")
a = A()
a.f(23)
A.f(23)
a.c()
A.c()
输出结果
I'm method f, the value is 23
I'm method f, the value is 23
my class is
partial
将类固定为方法的第一个参数。总结
__get__
、__set__
、__del__
等特殊方法的类,在属性访问时起着很大的作用。