可以在 Python 中的 class 中调用有状态函数吗?

Possible to call stateful function in a class in Python?

是否可以在Python中直接设置某个值并通过任何方式(继承、元class、class装饰器)在class中获取它? class B 不能被 A 中的 set('a') 污染。

import sys


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

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


class B:
    get()
    # -> None

这两个独立的 class 不相互引用,所以只要您不将同一个对象传递给两者,那么另一个也不会 'pollute'。要设置一个值并获取一个对象的值,你可以使用这样的东西:

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(不同的 class)或 aa 中设置它是同一个 A class 的不同实例。希望对您有所帮助!

编码愉快!

假设您知道自己在做什么,是的,可以在 class 主体中设置具有编程名称的值,然后检索,并将这些值限制在 class 主体中.

您所要做的就是使用 locals() 调用来获取命名空间字典,并使用该字典保存您的值:

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

这将打印 "a", 显然,这个值不会成为 class B 命名空间的一部分。

如果你只想存储值而不关联那么 有了名字,stackfull 项目提供了一个 pushpop 调用的行为就像 你在你的例子中提出 - 但是如果你用我们之前的 push 尝试 pop() 在相同的范围内,由于 堆栈下溢:


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 中使用 "walrus" 运算符,它不再有用)

好的 - 所以我列出这个是因为它类似于你问题中的代码,但你可能需要更主流的东西,比如在方法中编写代码,并设置实例属性。