gpt4 book ai didi

python - Python 类方法中的类 C 静态变量

转载 作者:行者123 更新时间:2023-12-02 16:55:08 24 4
gpt4 key购买 nike

经过 20 年的 C++ 经验,我正在努力学习 Python。

现在我想要一个方法(类中的一个函数),它有一个自己的“静态”变量,而不是一个静态变量。

可能一个伪代码示例可以更好地说明我想要什么。

class dummy:
@staticmethod
def foo():
foo.counter += 1
print "You have called me {} times.".format(foo.counter)
foo.counter = 0

注意 1:我使用 @staticmethod 只是为了简单起见,但这无关紧要。

注意 2: 这会因 AttributeError: 'staticmethod' object has no attribute 'counter' 而崩溃,但正如我上面所说,这是一个伪代码来阐明我的目标.

我已经了解到这在类之外有效:

def foo():
foo.counter += 1
print "You have called me {} times.".format(foo.counter)
foo.counter = 0

但同样的技巧似乎不适用于成员函数。

最后一分钟的信息,我只能使用 Python 2.7(不是我的选择)。

是否有任何合法且可靠的方法可以将持久变量(或常量)的范围限制在成员函数范围内?

一些相关链接

提前致谢。

最佳答案

实现此目的的一种方法是将您的变量隐藏在一个闭包中,因此对于您的目的而言它实际上是静态的。不幸的是,Python 2 不支持 nonlocal关键字,所以我们必须将变量的值包装在一个对象中(除非你只是想在方法中引用而不是改变变量(即分配给变量):

In [7]: class _Nonlocal:
...: def __init__(self, value):
...: self.counter = value
...:
...: def foo_maker():
...: nonlocal = _Nonlocal(0)
...: def foo(self):
...: nonlocal.counter += 1
...: print "You have called me {} times.".format(nonlocal.counter)
...: return foo
...:

In [8]: class Dummy(object): #you should always inherit from object explicitely in python 2
...: foo = foo_maker()
...:

In [9]: dummy = Dummy()

In [10]: dummy.foo()
You have called me 1 times.

In [11]: dummy.foo()
You have called me 2 times.

当然,这是为了避免使用实例变量而进行的大量繁琐操作。也许最好的解决方案是使您的方法成为自定义对象,并且您可以实现描述符协议(protocol)以使其可作为方法调用,如果您愿意,它可以作为实例方法使用:

In [35]: import types
...:
...: class Foo(object):
...: def __init__(this):
...: this.counter = 0
...: def __call__(this, self):
...: this.counter += 1
...: print "You have called me {} times.".format(this.counter)
...: print "here is some instance state, self.bar: {}".format(self.bar)
...: def __get__(this, obj, objtype=None):
...: "Simulate func_descr_get() in Objects/funcobject.c"
...: if obj is None:
...: return this
...: return types.MethodType(this, obj)
...:

In [36]: class Dummy(object): #you should always inherit from object explicitely in python 2
...: foo = Foo()
...: def __init__(self):
...: self.bar = 42
...:

In [37]: dummy = Dummy()

In [38]: dummy.foo()
You have called me 1 times.
here is some instance state, self.bar: 42

In [39]: dummy.bar = 99

In [40]: dummy.foo()
You have called me 2 times.
here is some instance state, self.bar: 99

对于习惯了 Python 约定的其他人来说,所有这些都是非常不规则和令人困惑的,尽管我希望你看到,Python 数据模型提供了很多自定义事物的能力。

请注意,我使用了 this作为第一个参数的名称,以避免与 self 混淆这实际上将来自 Foo 的对象get 被绑定(bind)为一种方法。

再次重申,我绝不会这样做。我会只使用实例变量,或者如果您的函数需要维护状态,则可能使用生成器,并且可以用作迭代器。

关于python - Python 类方法中的类 C 静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56811860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com