@@ property在变量不在类中而不在模块中时不起作用

问题描述 投票:-1回答:1

我有如下代码。我的要求是只填写一次BagABagB。因此,我没有一个类,但是在模块中编写了代码。我有带下划线的__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?
python python-3.x oop getter setter
1个回答
1
投票

我有带下划线的__BagA和__BagB,因为我不希望它从外面更改。

  • 这不是它的用途,双下划线是一种避免在继承方案中发生名称冲突的方法
  • 这不是它的工作方式,双下划线只是使用定义良好的方案来修饰名称,双下划线不会使事物成为私有或受保护的,它们仍然是完全公开的,并且对于任何关心的人都是可见的
  • 在模块级别不执行anything,而是在类级别实现

我有一个使用@property装饰器显示的吸气剂。但这不起作用。

[@propertydescriptor,它通过类的属性解析机制工作。

这里是您说符号是“私有”的符号,不应在python中使用:您在符号前加一个下划线。然后,如果其他人触摸它,那就是他们成为白痴或混蛋的问题。

© www.soinside.com 2019 - 2024. All rights reserved.