gpt4 book ai didi

python:不可变的私有(private)类变量?

转载 作者:太空狗 更新时间:2023-10-29 18:13:43 24 4
gpt4 key购买 nike

有什么方法可以将这段 Java 代码翻译成 Python 吗?

class Foo
{
final static private List<Thingy> thingies =
ImmutableList.of(thing1, thing2, thing3);
}

例如thingies 是属于 Foo 类而不是其实例的 Thingy 对象的不可变私有(private)列表。

我从这个问题中知道如何定义静态类变量 Static class variables in Python但我不知道如何使它们不可变且私有(private)。

最佳答案

在 Python 中,惯例是在属性名称上使用 _ 前缀来表示 protected__ 前缀来表示 private 。这不是由语言强制执行的;程序员应该知道不要编写依赖于非公开数据的代码。

如果你真的想强制执行不变性,你可以使用元类[ docs ] (一个类的类)。只需修改 __setattr____delattr__ 以在有人试图修改它时引发异常,并使其成为一个 tuple(一个不可变列表)[ docs ].

class FooMeta(type):
"""A type whose .thingies attribute can't be modified."""

def __setattr__(cls, name, value):
if name == "thingies":
raise AttributeError("Cannot modify .thingies")
else:
return type.__setattr__(cls, name, value)

def __delattr__(cls, name):
if name == "thingies":
raise AttributeError("Cannot delete .thingies")
else:
return type.__delattr__(cls, name)

thing1, thing2, thing3 = range(3)

class Foo(object):
__metaclass__ = FooMeta
thingies = (thing1, thing2, thing3)
other = [1, 2, 3]

例子

print Foo.thingies # prints "(0, 1, 2)"
Foo.thingies = (1, 2) # raises an AttributeError
del Foo.thingies # raise an AttributeError
Foo.other = Foo.other + [4] # no exception
print Foo.other # prints "[1, 2, 3, 4]"

在技术上仍然可以通过类的内部 .__dict__ 属性来修改它们,但这应该足以阻止大多数用户,完全保护 Python 对象是非常困难的。

关于python:不可变的私有(private)类变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7406943/

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