第46讲,描述符
4. 请问以下代码会打印什么内容?>>> class MyDes:
def __init__(self, value = None):
self.val = value
def __get__(self, instance, owner):
return self.val ** 2
>>> class Test:
def __init__(self):
self.x = MyDes(3)
>>> test = Test()
>>> test.x
答:如果你认为小甲鱼考的是 3 de 平方 == 9,那你就 too young too simple了!这其实是一个“陷阱”,我们先来看下会打印什么:
>>> test.x
<__main__.MyDes object at 0x1058e6f60>
复制代码
如你所见,访问实例层次上的描述符 x,只会返回描述符本身。为了让描述符能够正常工作,它们必须定义在类的层次上。如果你不这么做,那么 Python 无法自动为你调用 __get__ 和 __set__ 方法。`
以上是小甲鱼的题和答案,标红的地方是我不理解的,为什么上面代码中x就是实例层次上的描述符
我知道能得出9来的正确代码是这样,但是不明白下面的代码中x怎么就是类的层次了?
class MyDes:
def __init__(self, value = None):
self.val = value
def __get__(self, instance, owner):
return self.val ** 2
class Test:
x = MyDes(3)
test = Test()
test.x
定义在类层次中,就是在 class 定义内 def 定义外,x 显然在 class Test 类的定义内,这就是属于类的层次
Twilight6 发表于 2021-6-27 17:00
定义在类层次中,就是在 class 定义内 def 定义外,x 显然在 class Test 类的定义内,这就是属于类的层 ...
为什么只有在定义在类层次的属性,才可以了呢?用描述符
在def __init__()里的属性也是属性,为什么就不可以用描述符呢? 非凡 发表于 2021-6-27 17:37
为什么只有在定义在类层次的属性,才可以了呢?用描述符
在def __init__()里的属性也是属性,为什么就 ...
定义在__init__里面的不是类属性,而是实例化属性。看看这个帖子。python细节之8、类属性(方法)和类实例化属性(方法) 非凡 发表于 2021-6-27 17:37
为什么只有在定义在类层次的属性,才可以了呢?用描述符
在def __init__()里的属性也是属性,为什么就 ...
__init__ 是类的魔法方法,内部空间属于类的实例空间
在类中定义的方法(函数)也是同理,在方法的空间也都属于实例空间
越来越高科技了 Twilight6 发表于 2021-6-27 18:07
__init__ 是类的魔法方法,内部空间属于类的实例空间
在类中定义的方法(函数)也是同理,在方 ...
非常感谢版主,每次都能来答疑解惑{:7_123:}
页:
[1]