Как ограничить доступ к неопределенной переменной класса / экземпляра? - PullRequest
2 голосов
/ 30 мая 2019

Python, разрешающий доступ к неопределенной переменной класса / экземпляра

Я определил простой / пустой класс Python, как показано ниже.Теперь, если я устанавливаю значение для неопределенной переменной либо с помощью переменной экземпляра, либо с именем класса, Python свободно позволяет мне устанавливать значение для неопределенной переменной, а также позволяет мне обращаться к ней как к переменной экземпляра или класса, не выдавая никакой ошибки.Так что в ореховой оболочке я могу устанавливать неопределенные переменные экземпляра и класса без каких-либо проблем.

  1. Как мы ограничиваем пользователей от установки неопределенных переменных экземпляра и класса в Python.

  2. Здесь, как 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) 

Как мы можем ограничить пользователя от установки / доступа к неопределенной переменной экземпляр / экземпляр?

1 Ответ

1 голос
/ 30 мая 2019

Для этой цели вы можете установить __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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...