查找从Borg类派生的当前执行方法的父类(非超类)

我想创建一个从borg类派生的类
将作为脚本的一部分进行实例化或在其他类中包含.
当调用Borg类的方法时,我想知道
包含Borg类的类名称.
我从SYS模块的Inspect和_GetFrame玩过一些
获得不一致的结果.主要问题是Borg类是
实例化了包含类的外部,然后我需要上一个
不同数量的堆栈帧.但是这个信息不是
直到我用完堆栈框架之后.
希望以下代码更好地描述我要做的事情.
导入系统
博格级:
_shared_state = {}
def __init __(自我):
self .__ dict __ = self._shared_state
班级同化(Borg):
ValueByCaller = {}
def __init __(self,setupValue):
打印"同化.__ INT __()"
打印"设置为:" + str(setupValue)
#希望键是类的名称(或模块)
#继续同化
callerid = sys._getFrame(1).f_code.co_name
self.valuebycaller [callerid] = setupValue
打印self.valuebycaller
def动作(self,称为value):
打印"同化为Action()"
打印" self .__ className__:" + self .__ class __.__ name __
打印"称为Value为:" + str(称为Value)
打印" self.valuebycaller"
打印self.valuebycaller
#需要根据哪个类(或模块)获取正确的密钥
#打电话
#打印" 0:" + sys._getFrame(0).f_code.co_name
#打印" 1:" + sys._getFrame(1).f_code.co_name
#打印" 2:" + sys._getFrame(2).f_code.co_name
#打印" 3:" + sys._getFrame(3).f_code.co_name
callerid = sys._getFrame(2).f_code.co_name
打印" CallerId"
打印CallerID
if(self.valuebycaller [callerid] <= natervalue):
打印"行动"
A类:
assim_object =同化(2)
def __init __(自我):
self.assim_object.action(2)
self.assim_object.action(3)
B类:
assim_object =同化(3)
def __init __(自我):
self.assim_object.action(3)
self.assim_object.action(4)
C类:
assim_object =同化(4)
def __init __(自我):
self.assim_object.action(4)
self.assim_object.action(5)
a = a()
b = b()
C = C()
obj =同化(3)
#obj.action(3)
当我运行此功能时,我将获得以下输出:
在被同化的.__ Init __()中
设置值是:2
{'A2}
在被同化的.__ Init __()中
设置值是:3
{'a':2,'b':3}
在被同化的.__ Init __()中
设置值是:4
{'a':2,'c':4,'b':3}
在同化(Action)中()
self .__ className__:被同化
称呼为:2
self.valuebycaller
{'a':2,'c':4,'b':3}
来电显示
<模块>
Trackback(最近的最新电话):
文件" \ callerid.py",第67行,
a = a()
文件" \ callerid.py",第49行,in __init__
self.assim_object.action(2)
文件" \ callerid.py",第41行,行动
if(self.valuebycaller [callerid] <= natervalue):
KeyError:''
当我开始时,我发现最奇特的是
valuebycaller字典在__init____________________________
A的方法被执行.我很确定这与
差异 当对象实例化时,何时到达
初始化,但我需要做更多的研究和阅读才能成为
能够向自己解释.
感谢你给与我的帮助.
凯文

# 回答1


seanacais aécrit:
最简单的解决方案通常越好:明确通过
呼叫者(实例或模块或任何您想要的任何内容)
您知道,作为类属性,ValuebyCaller不会
Borg的一部分_shared_state?
无论如何,既然您覆盖__init__,并且不要打电话给borg .__ init__
同化的班级并不像博尔格一样行事.
(剪)
(剪)
的确.在A,B和C类中,Assim_object是类属性 - 所以
执行类语句时将进行安排.
一点也不.它与以下事实有关
在执行类语句本身之前,执行类块.
而且,由于您的班级语句处于顶级,因此执行
初始化模块(即传递给Python运行时或
首先导入).
的确.我可以建议您 *学习 * Python的对象模型和
Python的执行模型而不是假设什么?这将保存
您有很多时间和沮丧! - )

标签: python

添加新评论