如何限制对未定义的类/实例变量的访问?

时间:2019-05-29 23:43:00

标签: python python-3.x oop

Python允许访问未定义的类/实例变量

我定义了一个简单/空的python类,如下所示。现在,如果我使用实例变量或类名为未定义变量设置值,Python可以自由地允许我为未定义变量设置值,还可以像实例或类变量一样访问它而不会引发任何错误。因此,总而言之,我能够设置未定义的实例和类变量,而不会出现任何问题。

  1. 我们如何限制用户在Python中设置未定义的实例和类变量。

  2. 在这里,Python如何处理这些未定义的变量(undefined_variable_1undefined_variable_2)?这些被视为实例变量或类变量还是其他?

class Test:

  pass

### #Now instantiate the class and try setting & it accessing undefined variables
t1 = Test()

t1.undefined_variable_1 = "Undefined class/instance variable being set through instance variable (t1)"

### #Access the undefined variable through instance variable
print(t1.undefined_variable_1) 

Test.undefined_variable_2 = "Undefined class/instance variable being set through Class name (Test)"

### #Access the undefined variable through Class name
print(Test.undefined_variable_2) 

我们如何限制用户设置/访问未定义的实例/实例变量?

1 个答案:

答案 0 :(得分:1)

为此,您可以设置__slots__,它约束了类实例可以具有的属性:

class Restricted:

    __slots__ = ('a', 'b')

r = Restricted()
r.a = 1  # okay
r.b = 2  # okay
r.c = 3  # error

如果要为类对象具有相同的功能,则可以创建自定义元类并覆盖__setattr__

class RestrictedMeta(type):

    def __setattr__(self, attr, value):
        if attr in ('a', 'b'):
            super().__setattr__(attr, value)

        else:
            raise TypeError(f"Can't assign to attribute '{attr}' of class 'Restricted'")

class Restricted(metaclass=RestrictedMeta):
    pass

Restricted.a = 1  # okay
Restricted.b = 2  # okay
Restricted.c = 3  # error