当前位置: 首页 > 面试题库 >

函数如何访问自己的属性?

郗欣嘉
2023-03-14
问题内容

是否可以从函数范围内访问python函数对象属性?

例如让我们

def f():
    return SOMETHING

f._x = "foo"
f()           # -> "foo"

现在,如果要返回_x属性内容“ foo”,则必须是什么?如果有可能(简单)

谢谢

更新:

我也想做以下工作:

g = f
del f
g()          # -> "foo"

更新2:

声明不可能(如果是这种情况),以及为什么,比提供一种方法来伪造它更令人满意,例如使用不同于函数的对象


问题答案:

使函数的默认参数之一成为对函数本身的引用。

def f(self):
    return self.x
f.func_defaults = (f,)

用法示例:

>>> f.x = 17
>>> b = f
>>> del f
>>> b()
17

说明

原始张贴者想要一种不需要全局名称查找的解决方案。简单的解决方案

def f():
    return f.x

f在每个调用上执行不符合要求的全局变量的查找。如果f被删除,则功能失败。更复杂的inspect建议以相同的方式失败。

我们想要执行 早期绑定 并将绑定的引用存储在对象本身内。从概念上讲,以下是我们在做什么:

def f(self=f):
    return self.x

在上面,self是局部变量,因此不执行全局查找。但是,我们无法按原样编写代码,因为f在尝试将默认值绑定到该代码时尚未定义self。相反,我们在f定义后设置默认值。

装饰器

这是一个简单的装饰器,可以为您完成此操作。请注意self,与方法不同,自变量必须排在最后,而方法排在self第一位。这也意味着,如果任何其他参数采用默认值,则必须提供默认值。

def self_reference(f):
    f.func_defaults = f.func_defaults[:-1] + (f,)
    return f

@self_reference
def foo(verb, adverb='swiftly', self=None):
    return '%s %s %s' % (self.subject, verb, adverb)

例:

>>> foo.subject = 'Fred'
>>> bar = foo
>>> del foo
>>> bar('runs')
'Fred runs swiftly'


 类似资料:
  • 如果我尝试调用GMail API,我会得到以下错误: 首先我生成一个代币 接下来我测试令牌 我得到一个错误400错误的请求作为回报。但如果我使用不同的范围,例如谷歌,我会得到200 ok。 我认为错误是“sub”:客户的电子邮件。我尝试在谷歌控制台中添加更多的GMail,有3封邮件是自动为项目创建的,只有来自Json的邮件返回我失败,如果尝试其他邮件,包括自动为项目创建的邮件和我自己的GMail(

  • 问题内容: 我有一个像这样的对象: 现在,当我尝试访问键“ 0”的值时,例如: …我遇到了错误。(也许这不是正确的方法吗?) 如何访问数字键的值(如上)? 问题答案: 这应该工作: (是的替代语法。) 您会收到此错误,因为在JavaScript中,标识符不能以数字开头。 JavaScript标识符必须以字母,下划线(_)或美元符号($)开头;后续字符也可以是数字(0-9)。因为JavaScript

  • 关于rust导入函数的问题,我的工程格式如下: src/main.rs src/api/api.rs api.rs 里有一个函数: pub async fn root() {} 问题是:我该如何在main.rs下调用这个root,我试过各种文档上的方法都不行。求助各位 知道怎么导入

  • 问题内容: 目标是可以轻松访问任何级别的SwiftUI视图层次结构的托管窗口。目的可能有所不同- 关闭窗口,退出第一响应者,替换根视图或contentViewController。与UIKit / AppKit集成有时也需要通过窗口的路径,因此… 我在这里遇到和尝试过的 像这样的东西 或通过在每个SwiftUI视图中添加UIViewRepresentable / NSViewRepresentab

  • 本文向大家介绍如何使用自己的原型访问JavaScript对象?,包括了如何使用自己的原型访问JavaScript对象?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过使用名为“ Object.create() ”的javascript方法创建自己的原型来访问现有对象。使用此方法,我们可以将属性从现有属性继承到新创建的原型。让我们简要地讨论一下。 语法 此方法采用现有对象并创建自己的原型,以便

  • 在Java你有很多列表函数。例如: List.size(),List.is空()... 是否有可能使我自己的函数,如List.null或空(),我怎么能做到这一点? 这会对我帮助很大。