Сделать функцию недоступной при использовании моего API - PullRequest
0 голосов
/ 10 июля 2020

Я работаю над API для своего веб-сайта, я выпущу API как пакет для Python. Как сделать функцию недоступной из объекта класса? Я пытался использовать classmethod, но похоже, что это не работает, я все еще могу получить доступ к функции из внешнего файла Python.

main.py

class MyClass:
   def __init__(self):
       self.my_var = 5
   
   @classmethod
   def dont_access_me(self) -> str:
       return 'Dont Access Me'

second.py

from main import MyClass

instance = MyClass()
print(instance.dont_access_me()) # valid

Ответы [ 3 ]

0 голосов
/ 10 июля 2020

Я не уверен, что это то, что вы ищете, но вы можете сделать его частным методом, примерно так:

def _dont_access_me(self):
     return 'Dont Access Me'

технически он все равно будет доступен, но по крайней мере, позволяет пользователям узнать, что это частный метод

0 голосов
/ 10 июля 2020

Python на самом деле не имеет частных методов.

Однако распространенной практикой является префикс методов с подчеркиванием, если вы хотите указать, что пользователи не должны использовать эту функцию и что пользователи не могут ожидать, что эта функция будет существовать или иметь такую ​​же подпись в будущей версии вашего API.

если у вас есть:

class MyClass:
   def __init__(self):
       self.my_var = 5

   def amethod(self):
       rslt = self._dont_access_me()

   def _dont_access_me(self) -> str:
       return 'Dont Access Me'

instance = MyClass()

, то пользователи знают, что они могут использовать .

instance.amethod(), но они не должны использовать instance._dont_access_me()

методы классов, как и в большинстве других языков программирования, нечто совершенно иное. Они используются для методов, которые могут быть вызваны без экземпляра. Однако их также можно вызвать, если у вас есть экземпляр.

Примером может быть:

class AClass:
    instance_count = 0

    def __init__(self):
        cls = self.__class__
        cls.instance_count += 1
        self.idx = cls.instance_count

    @classmethod
    def statistics(cls):
        print("So far %d objects were instantiated" %
              cls.instance_count)


a = AClass()
b = AClass()
AClass.statistics()

# However you can also access a classmethod if you have an instance
a.statistics()
0 голосов
/ 10 июля 2020

Вы не можете сделать метод класса действительно приватным. В этом вопросе есть хорошее обсуждение этого вопроса: Почему «частные» методы Python на самом деле не являются частными?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...