pythonは__class__
変数をcell
のsuper()
コールに置き換えます。このセルは、最初のスタックフレームの変数free
から取得されます。pythonに格納されている `__class__`変数はどこですか?また、コンパイラはどこでそれを見つけるのかを知っています
この変数はlocals()
ではありませんが、奇妙なことは__init__
メソッドから参照しただけです。例えば
テイクコードのこのビット:
class LogicGate:
def __init__(self,n):
print(locals())
a = __class__
print(locals())
あなたはこれを分解し、あなたが何らかの形でそれを見ることができるがprint
とlocals
はグローバルであり、__class__
がLOAD_DEREF
であることを知っています。コードを実行する前に、コンパイラはこれをどのように知っていますか? locals
、print
および__class__
は、私が知る限り、コンパイラの変数名です。また、このように__class__
はa
にコピーされる前でさえ、すべてがlocals()
に突然入っています。
4 10 LOAD_DEREF 0 (__class__)
locals
ながら:私はjavascriptのコンパイラへのpython skulpt働いているので、私は聞いてるのよ
2 LOAD_GLOBAL 1 (locals)
。現在、コンパイラはprint
または__class__
を区別せず、両方をグローバルスコープから取得しようとしています。
あなたは上記のコードビットのASTのプリントアウトからわかるように、パーサはlocals
または__class__
を区別しません:
Module(body=[ClassDef(name='LogicGate',
bases=[],
keywords=[],
body=[FunctionDef(name='__init__',
args=arguments(args=[arg(arg='self',
annotation=None),
arg(arg='n',
annotation=None)],
vararg=None,
kwonlyargs=[],
kw_defaults=[],
kwarg=None,
defaults=[]),
body=[Expr(value=Call(func=Name(id='print',
ctx=Load()),
# here's the load for locals
args=[Call(func=Name(id='locals',
ctx=Load()),
args=[],
keywords=[])],
keywords=[])),
Assign(targets=[Name(id='a',
ctx=Store())],
# here's the load for __class__
value=Name(id='__class__',
ctx=Load())),
Expr(value=Call(func=Name(id='print',
ctx=Load()),
args=[Call(func=Name(id='locals',
ctx=Load()),
args=[],
keywords=[])],
keywords=[]))],
decorator_list=[],
returns=None)],
decorator_list=[])])
問題は、python2であなたがどこからともなく '__class__'を参照することはできません場合、私は一部を発見しました。それはDEREFには及ばない。 – albertjan
あなたはPython 2またはPython 3を使用していますか? '__class__'セルは、' super'がargsなしで呼び出されるようにするPython 3のハックです。 – Dunes