gpt4 book ai didi

python - 了解 python 描述符示例 (TypedProperty)

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:20 25 4
gpt4 key购买 nike

这是在 python 书中找到的一些代码的略微修改版本:

class TypedProperty(object):
def __init__(self,name,type,default=None):
self.name = "_" + name
self.type = type
self.default = default if default else type()
def __get__(self,instance,cls):
return getattr(instance,self.name,self.default)
def __set__(self,instance,value):
if not isinstance(value,self.type):
raise TypeError("Must be a %s" % self.type)
setattr(instance,self.name,value)

class Foo(object):
name = TypedProperty("name",str)
num = TypedProperty("num",int,42)

f = Foo()
f.name = 'blah'

我的问题:为什么我们要在 f 中创建属性?在上面的代码中,TypedProperty 被编写为 f.name = 'blah' 在实例 f 中创建属性“_name”。

为什么不将值保存为类 TypedProperty 的属性?这是我的想法:

class TypedProperty2(object):
def __init__(self, val, typ):
if not isinstance(val, typ):
raise TypeError()
self.value = val
self.typ = typ

def __get__(self, instance, owner):
return self.value

def __set__(self, instance, val):
if not isinstance(val, self.typ):
raise TypeError()
self.value = val

这是一个任意的设计决定吗?

最佳答案

所有 类的实例将共享相同的描述符实例(例如 TypedProperty)。因此,如果您将值存储在 TypedProperty 上,则 Foo 的所有实例都将具有相同的 namenum 值 值。这对于描述符来说通常是不可取的(或预期的)。

例如如果您运行以下脚本:

class TypedProperty2(object):
def __init__(self, val, typ):
if not isinstance(val, typ):
raise TypeError()
self.value = val
self.typ = typ

def __get__(self, instance, owner):
return self.value

def __set__(self, instance, val):
if not isinstance(val, self.typ):
raise TypeError()
self.value = val


class Foo(object):
name = TypedProperty2("name", str)

f1 = Foo()
f1.name = 'blah'

f2 = Foo()
print(f2.name)
f2.name = 'bar'

print(f1.name)

您将看到以下输出:

blah
bar

所以我们可以看到最初 f2f1 的名字,然后,在改变 f2 的名字之后,f1 选择了 f2 的名字。

关于python - 了解 python 描述符示例 (TypedProperty),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34884947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com