gpt4 book ai didi

python - 使类方法识别它在哪个类上下文中运行

转载 作者:行者123 更新时间:2023-11-28 22:03:33 25 4
gpt4 key购买 nike

我需要重构现有代码,方法是将在相互继承的各种类之间复制粘贴的方法折叠成一个方法。所以我产生了以下代码:

class A(object):
def rec(self):
return 1

class B(A):
def rec(self):
return self.rec_gen(B)

def rec_gen(self, rec_class):
return super(rec_class, self).rec() + 1

class C(B):
def rec(self):
return self.rec_gen(C)

if __name__=='__main__':
b = B(); c = C()
print c.rec()
print b.rec()

输出:

3
2

仍然困扰我的是,在“rec”方法中,我需要告诉“rec_gen”它正在运行的类的上下文。有没有办法让“rec_gen”在运行时自行解决?

最佳答案

此功能已添加到 Python 3 - 请参阅 PEP 3135 .简而言之:

class B(A):
def rec(self):
return super().rec() + 1

我认为您已经创建了令人费解的 rec()/rec_gen()设置,因为您无法自动找到该类,但如果您仍然需要,则以下内容应该有效:

class A(object):
def rec(self):
return 1

class B(A):
def rec(self):
# __class__ is a cell that is only created if super() is in the method
super()
return self.rec_gen(__class__)

def rec_gen(self, rec_class):
return super(rec_class, self).rec() + 1

class C(B):
def rec(self):
# __class__ is a cell that is only created if super() is in the method
super()
return self.rec_gen(__class__)

Python 2 中最简单的解决方案是使用私有(private)成员来保存 super对象:

class B(A):
def __init__(self):
self.__super = super(B)

def rec(self):
return self.__super.rec() + 1

但这仍然需要在一个地方指定实际的类,如果您碰巧在类层次结构中有两个同名的类(例如,来自不同的模块),则此方法将中断。

在 PEP 3135 存在之前,我们中有几个人为 Python 2 制定了自动解析的方法 - 我的方法在 self.super on ActiveState。 .基本上,它允许以下内容:

class B(A, autosuper):
def rec(self):
return self.super().rec() + 1

或者在您调用同名父方法的情况下(最常见的情况):

class B(A, autosuper):
def rec(self):
return self.super() + 1

此方法的注意事项:

  1. 速度很慢。我有一个版本在某个地方进行字节码操作以大大提高速度。

  2. 它与 PEP 3135 不一致(尽管它是一个阶段的 Python 3 super 提案)。

  3. 这很复杂。

  4. 这是一个混合基类。

不知道以上是否能满足你的要求。通过对食谱稍作改动,您可以找出自己所在的类(class)并将其传递给 rec_gen() - 基本上从 _getSuper() 中提取类查找代码进入它自己的方法。

关于python - 使类方法识别它在哪个类上下文中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8968124/

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