gpt4 book ai didi

python - 我应该使用描述符类还是属性工厂?

转载 作者:太空狗 更新时间:2023-10-30 01:38:11 24 4
gpt4 key购买 nike

<分区>

假设我有一个类,我想创建很多类似的“property-style”属性。例如:

class Foo(object):
@property
def foo(self):
return self._foo

@foo.setter
def foo(self, val):
self.update()
self._foo = val

@property
def bar(self):
return self._bar

@bar.setter
def bar(self, val):
self.update()
self._bar = val

@property
def baz(self):
return self._baz

@baz.setter
def baz(self, val):
self.update()
self._baz = val

def update(self):
print "Updating..."

显然这里有很多重复,最好将其排除在外。一种方法是制作一个返回属性的函数:

def create_property(var):
def _setter(self, val):
self.update()
setattr(self, '_' + var, val)

def _getter(self):
return getattr(self, '_' + var)

return property(_getter, _setter)

class Foo(object):
foo = create_property("foo")
bar = create_property("bar")
baz = create_property("baz")

def update(self):
print "Updating..."

或者我可以写一个描述符类:

class UpdateOnChange(object):
def __init__(self):
self.data = WeakKeyDictionary()

def __get__(self, instance, owner):
try:
return self.data[instance]
except KeyError:
raise AttributeError("attribute not set")

def __set__(self, instance, value):
instance.update()
self.data[instance] = value

class Foo(object):
foo = UpdateOnChange()
bar = UpdateOnChange()
baz = UpdateOnChange()

def update(self):
print "Updating"

哪个最好/最快/最 Pythonic?

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