Python允许访问未定义的类/实例变量
我定义了一个简单/空的python类,如下所示。现在,如果我使用实例变量或类名为未定义变量设置值,Python可以自由地允许我为未定义变量设置值,还可以像实例或类变量一样访问它而不会引发任何错误。因此,总而言之,我能够设置未定义的实例和类变量,而不会出现任何问题。
我们如何限制用户在Python中设置未定义的实例和类变量。
在这里,Python如何处理这些未定义的变量(undefined_variable_1
和undefined_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)
我们如何限制用户设置/访问未定义的实例/实例变量?
答案 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