Можно ли вызвать функцию с отслеживанием состояния в классе в Python? - PullRequest
0 голосов
/ 29 мая 2020

Можно ли напрямую установить определенное значение и получить его в классе любым способом (наследование, метакласс, декоратор класса) в Python? класс B не должен загрязняться набором ('a') в A.

import sys


class A:
    set('a')
    get()
    # -> 'a'

    print(sys.modules[__name__])
    # => <module '__main__'>


class B:
    get()
    # -> None

Ответы [ 2 ]

1 голос
/ 30 мая 2020

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

Все, что вам нужно сделать, это использовать вызов locals() для получения словаря пространства имен и использовать этот словарь для хранения ваших значений:

class A:
    locals()["key"] = "a"
    print(locals()["key"] )

Это напечатает "a", и, очевидно, это значение выиграло 'не быть частью пространства имен класса B.

Если вы хотите просто хранить значения без привязки к имени, проект stackfull предоставляет вызовы push и pop, которые будут вести себя так же, как вы предложили в своем примере, но если вы попробуете pop() без предыдущего push в той же области, вы получите ошибку из-за переполнения стека:


In [4]: !pip install stackfull                                                                 
Collecting stackfull
...
Successfully installed stackfull-1.0.0


In [5]: from stackfull import push, pop                                                        

In [6]: class A: 
   ...:     push("a") 
   ...:     push("b") 
   ...:     print(pop()) 
   ...:     print(pop()) 
   ...:                                                                                        
b
a
In [7]: class B: 
   ...:     pop() 
   ...:   
...
StackUnderflowError:

(Отказ от ответственности - я автор пакета stackfull. Мне никогда особо не требовалось ничего, кроме того, что уже есть, поэтому он давно не обновлялся - а с оператором "морж" в Python 3.8 он больше не так полезен)

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

0 голосов
/ 29 мая 2020

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

class A:
    def __init__(self):
        self.letter = None
    def set_value(self, letter):
        self.letter = letter
    def get_value(self):
        return self.letter if self.letter else '(none set)'

class B:
    def __init__(self):
        self.letter = None
    def set_value(self, letter):
        self.letter = letter
    def get_value(self):
        return self.letter if self.letter else '(none set)'

>>> a = A()
>>> aa = A()
>>> b = B()
>>> a.set_value('z')
>>> print(f'values in a, aa, and b are: {a.get_value()}, {aa.get_value()}, {b.get_value()}')
values in a, aa, and b are: z, (none set), (none set)

Итак, как видите, установка буквы объекта a не устанавливает его в b (другой класс) или aa, который является другим экземпляром того же класса A. Надеюсь, это поможет!

Удачного кодирования!

...