@property не работает, когда переменные находятся не в классе, а в модуле - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть код, как показано ниже. Мое требование - заполнить BagA и BagB один раз и только один раз. Итак, у меня нет класса, но я написал код в модуле. У меня есть __BagA и __BagB с подчеркиванием, потому что я не хочу, чтобы это изменилось снаружи. У меня есть получатель, как показано, используя @property декоратор. Но это не работает.

module.py:

import csv
import sys
import threading

__BagA = list()
__BagB = dict()
__lock = threading.Lock()

@property
def BagA():
    if not __BagA:
        raise("Call Initialize() first")
    else:
        return __BagA

@property
def BagB():
    if not __BagB:
        raise("Call lookup.Initialize() first")
    else:
        return __BagB

def __get__BagA(directory):
   #logic to populate BagA
   BagA=some list

def __get__BagB(directory):
   #logic to populate BagB
   BagB=dict after processing the logic

def initialize(directory):
    __lock.acquire()

    __get__BagA(directory)
    __get__BagB(directory)

    __lock.release()

Основной сценарий:

import module

module.initialize("dir")#this works. I see all bags getting populated
#Below does not work
module.BagA #This gives an object with some fget and fset and not the value of BagA

#below works
module.__BagA

Еще одна проблема заключается в том, что вместо __BagA, который все еще может быть измененным извне, я мог бы написать BagA и иметь декоратор @Bag.setter и декоратор @BagA.deleter, который возвращает исключение, говорящее «вы не можете изменить это».

Они также не работают, и я не хочу писать их отдельно, но в одной строке, как показано ниже, потому что они ведут себя одинаково. Не работает ни отдельная, ни одна строка:

@BagA.setter,@BagA.deleter
def BagA(value):
    print('cannot set or delete') #Is this possible?

1 Ответ

1 голос
/ 05 февраля 2020

У меня есть __BagA и __BagB с подчеркиванием, потому что я не хочу, чтобы оно менялось снаружи.

  • это не то, для чего это нужно, двойное подчеркивание - это способ избегайте коллизий имен в сценарии наследования ios
  • это не так, как это работает, двойное подчеркивание просто искажает имена с помощью четко определенной схемы, двойное подчеркивание не делает вещи частными или защищенными, они ' Он по-прежнему полностью опубликован c и виден всем, кому небезразлично
  • , который не выполняет ничего на уровне модуля, он реализован на уровне класса

У меня есть геттер, как показано на примере @property decorator. Но это не работает.

@property - это дескриптор , он работает через механизм разрешения атрибутов классов.

Вот как вы это говорите символ является «частным» и не должен быть затронут в python: перед ним ставится один знак подчеркивания. Тогда, если другие прикасаются к этому, это их проблема для идиотов или придурков.

...