gpt4 book ai didi

python - 在 Python 方法中设置属性

转载 作者:太空狗 更新时间:2023-10-30 02:23:16 25 4
gpt4 key购买 nike

我想在类方法中设置一个只读属性。
我已经试过了:

class Foo(object):
def __init__(self, v):
self._set('_v', v)

def _set(self, attr, v):
setattr(self, attr, v)
setattr(Foo, attr[1:], property(lambda self: getattr(self, attr)))

但是这太可怕了。还有别的办法吗?我需要做的是设置属性:

class Foo(object):
def __init__(self, v):
self._v = v

@ property
def v(self):
return self._v

>>> f = Foo(42)
>>> f.v
42
>>> f.v = 41
AttributeError: can't set attribute ## This is what I want: a read-only attribute

但我需要在一个方法中完成它。还有别的办法吗?

谢谢你,
魔方

附言我已经检查过这篇文章,但它并没有解决我的问题: Using Python property() inside a method

编辑:我不能使用property,因为我想在一个方法中设置它。我只能从外部使用 property:

class Foo(object):
def __init__(self, v):
self._v = v
@ property
def v(self):
return self._v
## ...OR
def getv(self):
return self._v
v = property(getv)

我不能那样做,因为我不知道属性名称,我必须动态设置它。像这样:

class Foo(object):
def __init__(self, v):
self._set_property_from_inside('v', v)
>>> f = Foo(42)
>>> f.v
42

最佳答案

认为您正在寻找 python descriptors .

class MyDescriptor(object):
def __init__(self, protected_attr_name):
self.attr = protected_attr_name

def __get__(self, obj, objtype):
return getattr(obj, self.attr)

def __set__(self, obj, value):
#setattr(obj, self.attr, value)
raise AttributeError("Can't set attribute")

class Foo(object):
def __init__(self, k, v):
setattr(self.__class__, k, MyDescriptor("_" + k))
setattr(self, "_" + k, v)

f = Foo("v", 42)
print f.v # Prints 42
try:
f.v = 32
except AttributeError:
pass
print f.v # Prints 42

在这里,您可以在 __get____set__ 方法中做任何您想控制的访问。如果您在 __get__ 中调用 obj.get_v 并在 __set__ 中调用 obj.set_v,这与属性的实际实现非常接近,如您在上面的链接中所见。

编辑:已修复。我自己应该更好地阅读那一页。引用:

For objects, the machinery is in object.__getattribute__ which transforms b.x into type(b).__dict__['x'].__get__(b, type(b))

因此,如果您将描述符放在实例的 __dict__ 中,当您将该属性设置为新值时,它们将被简单地覆盖。

关于python - 在 Python 方法中设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5078726/

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