python - 防止/改变对类变量的访问

标签 python class-variables

<分区>

有没有一种方法可以通过重写实例变量的 __setattr__ 来阻止或改变对 Python 中类变量的访问?

请注意 this question标题错误,实际上指的是实例变量,而不是类变量。

根据阅读多篇关于(明显的)死亡陷阱的文章,即 __slots__,我宁愿不走那条路(而且我还没有充分研究以了解它是否做了什么我在问)。

例子:

class A(object):

    foo = "don't change me"

    def __setattr__(self, name, value):
        raise ValueError

if __name__ == '__main__':
a1 = A()
print a1.foo # don't change me
print A.foo  # don't change me

A.foo = 'bar' # ideally throw an exception or something here
print A.foo   # bar
a2 = A()
print a1.foo  # bar
print a2.foo  # bar

最佳答案

是的!您以完全相同的方式进行操作。

类上的 __setattr__ 方法控制对该类实例的属性设置。在 Python 中,一切都是对象。对象有类。因此,您只需要将您的类安排为某个具有 __setattr__ 方法的类的实例,就像您希望防止实例修改其属性时所做的那样!

类的类称为元类。默认元类是 type:“类型的类型”或“类的类”。您想要创建一个不允许设置其实例属性的 type 的子类(就像您创建一个不允许设置其实例属性的 object 的子类一样当您在实例级别执行此操作时进行设置)。

class CantTouchThis(type):
    def __setattr__(cls, attr, value):
        raise Exception("NO!")

class SomeClass(object):
    __metaclass__ = CantTouchThis

请注意SomeClass基类SomeClass 之间的区别. SomeClassobject 的子类。它是 CantTouchThis 的一个实例。

几乎所有在实例级别工作的其他东西都可以类似地应用于元类的类级别;类只是像其他一切一样的实例。由于 type 的方法和实现,它们才具有独特的优雅行为(完全如...等等)。

关于python - 防止/改变对类变量的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12359707/

相关文章:

Python如何使用ArgumentParser.convert_arg_line_to_args跳过文件中的注释行

python - 如何模拟属于库一部分的父类(super class)?

ruby - 我可以使用全局变量初始化类变量吗? ( ruby )

python 在将参数传递给 init 时引用类变量

python - zlib 的 deflate 算法的时间复杂度

python - 循环遍历表单 POST 将数据存储在 python 变量中

python - Matplotlib 日期作为刻度

Ruby 模块包含和类变量

java - 最终定义不明确吗?

java - 为什么 Groovy Enums 无法访问类变量?