可以在 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
项目提供了一个
push
和 pop
调用的行为就像
你在你的例子中提出 -
但是如果你用我们之前的 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" 运算符,它不再有用)
好的 - 所以我列出这个是因为它类似于你问题中的代码,但你可能需要更主流的东西,比如在方法中编写代码,并设置实例属性。
是否可以在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
项目提供了一个
push
和 pop
调用的行为就像
你在你的例子中提出 -
但是如果你用我们之前的 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" 运算符,它不再有用)
好的 - 所以我列出这个是因为它类似于你问题中的代码,但你可能需要更主流的东西,比如在方法中编写代码,并设置实例属性。