Что желаю:

# main.py
import config
config.test = True
print(config.test)  # True
print(config._test)  # None

Что пробовал:

# config.py
_test = False

@property
def test():
    return _test

@test.setter
def test(new_value):
    global _test
    _test = new_value
    logger.info(f'config: test is set to {new_value}')

Было бы неплохо избежать использования обычного метода, такого как config.set_test(new_value). Спасибо

1
Valentin Fabianski 25 Ноя 2022 в 21:34

1 ответ

Сделайте это классом

class Config:
    @property
    def test(self):
        return self._test

    @test.setter
    def test(self, value):
        self._test = value

    def __init__(self, **kwargs):
        self._test = None

Однако в каком-то смысле это не имеет смысла, и причина в том, что у вас есть геттер И сеттер, поэтому на самом деле вы просто проходите долгий путь, чтобы установить переменную. Вы можете просто преобразовать self._test в self.test и удалить геттер/сеттер для тех же результатов.

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

class Config:
    @property
    def test(self):
        return self._test

    def __init__(self, **kwargs):
        self._test = None

ИМО, иметь сеттер имеет смысл только в том случае, если кишки сеттера делают что-то нетривиальное. Например, если вы используете tkinter и хотите преобразовать параметры в свойства, может иметь смысл иметь установщик, потому что то, что вы получаете и устанавливаете, на самом деле является вызовами TCL. Другими словами, это не просто псевдоним для приватной переменной.

Примере:

#mixin to convert root attributes and options to properties
class Root_mi:         
    @property
    def alpha(self) -> float:
        return self.tk.call('wm', 'attributes', self._w, '-alpha')
        
    @alpha.setter
    def alpha(self, f:float) -> None:
        self.tk.call('wm', 'attributes', self._w, '-alpha', f)
       
    @property
    def alwaysontop(self) -> bool:
        return self.tk.call('wm', 'attributes', self._w, '-topmost')
        
    @alwaysontop.setter
    def alwaysontop(self, b:bool) -> None:
        self.tk.call('wm', 'attributes', self._w, '-topmost', b)
        
#more...
1
OneMadGypsy 25 Ноя 2022 в 22:16