我有如下代码。我的要求是只填写一次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?
我有带下划线的__BagA和__BagB,因为我不希望它从外面更改。
我有一个使用@property装饰器显示的吸气剂。但这不起作用。
[@property
是descriptor,它通过类的属性解析机制工作。
这里是您说符号是“私有”的符号,不应在python中使用:您在符号前加一个下划线。然后,如果其他人触摸它,那就是他们成为白痴或混蛋的问题。