【问题标题】:Python inheritance and instantiationPython继承和实例化
【发布时间】:2012-07-19 12:53:25
【问题描述】:

我很难理解 Peter Norvig 的代码中的一点,“更好的 Python Lisp 解释器”,here

在eval函数中,针对解析,他在做测试isanstance(x,Symbol)。类 Symbol 之前定义过,但它没有方法,因为它是用 pass 声明的:

 class Symbol(str): pass

这些行构建了一个符号表。

def Sym(s, symbol_table={}):
    "Find or create unique Symbol entry for str s in symbol table."
    if s not in symbol_table: symbol_table[s] = Symbol(s)
    return symbol_table[s]

_quote, _if, _set, _define, _lambda, _begin, _definemacro, = map(Sym, 
"quote   if   set!  define   lambda   begin   define-macro".split())

_quasiquote, _unquote, _unquotesplicing = map(Sym,
"quasiquote   unquote   unquote-splicing".split())

我不明白为什么Symbol(s) 可以工作,因为没有定义 Symbol 类的构造函数。之后,eval 方法通过以下方式检查令牌是否为符号:

def eval(x, env=global_env):
     "Evaluate an expression in an environment."
      while True:
          if isa(x, Symbol):       # variable reference
              return env.find(x)[x]
          else: #other stuff

isa(x,Symbol) 是个谜。这里在代码中,应该检查token是否是一个变量引用(即x,与之前定义的x)。在我看来,这里的 Symbol(s) 是对字符串的一种装饰,在用

构建的初始化列表中
  _quote, _if, _set, _define, _lambda, _begin, _definemacro, = map(Sym, 
     "quote   if   set!  define   lambda   begin   define-macro".split())

您能否根据您对 P. Norvig 的代码的了解或阅读或 Python 的经验进行解释?谢谢

【问题讨论】:

    标签: python scheme interpreter isinstance


    【解决方案1】:

    像所有其他方法一样,__init__ 是继承的。 Symbol 继承 str__init__

    更新:进一步注意__init__ 执行初始化,而不是构造,并且初始化代码(效果略有不同)也可以存在于类定义中。这意味着即使不需要调用__init__,也可以存在有效对象。

    【讨论】:

      【解决方案2】:

      Symbol 的类定义只是它是str 的子类。换句话说,它是大多数意图和目的的字符串。

      >>> class Symbol(str): pass
      ... 
      >>> x=Symbol('abc')
      >>> x
      'abc'
      

      虽然它是一个新类,这意味着解释器对它的处理会有所不同:

      >>> x == 'abc' # __eq__ is inherited
      True
      >>> x is 'abc' # different memory location from 'abc'
      False
      >>> y='abc'
      >>> y is 'abc'
      True
      

      isaisinstance 的(相当不必要的)重新定义,它只是检查变量是否是Symbol 的实例:

      >>> isa = isinstance
      >>> isa('abc', Symbol)
      False
      >>> isa(x, Symbol)
      True
      

      【讨论】:

      • y is 'abc' 其实不靠谱;它取决于 CPython 的实现细节(短字符串优化)。
      • @larsmans 是的,这是一个很好的观点,但无论y is 'abc'x is 'abc' 是否应该始终为 False。这就是我想要表达的观点。
      猜你喜欢
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2017-10-21
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多