判断 __getattr__ 是方法还是属性调用

2024-02-17

有什么方法可以使用 __getattr__ 确定方法和属性调用之间的区别吗?

I.e. in:

class Bar(object):
    def __getattr__(self, name):
        if THIS_IS_A_METHOD_CALL:
            # Handle method call
            def method(**kwargs):
                return 'foo'
            return method
        else:
            # Handle attribute call
            return 'bar'

foo=Bar()
print(foo.test_method()) # foo
print(foo.test_attribute) # bar

这些方法不是本地的,因此无法使用 getattr/callable 来确定它。我也明白方法是属性,并且可能没有解决方案。只是希望有一个。


你无法判断一个对象将如何在__getattr__钩子,根本。您可以访问方法而不调用它们,将它们存储在变量中,并且later例如,给他们打电话。

返回一个带有 a 的对象__call__方法,调用时会调用:

class CallableValue(object):
    def __init__(self, name):
        self.name = name
    def __call__(self, *args, **kwargs):
        print "Lo, {} was called!".format(self.name)

class Bar(object):
    def __getattr__(self, name):
        return CallableValue(name)

但它的实例不会同时与字符串或列表相同。

Demo:

>>> class CallableValue(object):
...     def __init__(self, name):
...         self.name = name
...     def __call__(self, *args, **kwargs):
...         print "Lo, {} was called!".format(self.name)
... 
>>> class Bar(object):
...     def __getattr__(self, name):
...         return CallableValue(name)
... 
>>> b = Bar()
>>> something = b.test_method
>>> something
<__main__.CallableValue object at 0x10ac3c290>
>>> something()
Lo, test_method was called!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断 __getattr__ 是方法还是属性调用 的相关文章

随机推荐

  • BufferedReader.ready() 方法是否确保 readLine() 方法不返回 NULL?

    我有这样的代码来读取文本文件BufferedReader BufferedReader reader null try reader new BufferedReader new FileReader file1 txt while rea
  • BizTalk - 0 参数 Web 消息未在请求中发送

    我正在连接到 SOAP 1 1 Web 服务 不接受任何参数并返回一个简单的字符串响应 我已经使用旧的 NET 2 0 为复杂类型生成了 xsd 文件添加网页参考它还在 Reference odx 中生成了端口和多部分消息类型 在我的编排中
  • 如何将当前执行状态压入堆栈以便稍后继续执行?

    想象一个简单的语法 a ab c 其内容为 a 或 ab 后跟 c 解析树看起来像这样 and or c a ab 现在给它这个输入 abc 我们首先沿着树的左侧向下遍历 并匹配 a 然后返回上一层 由于 a 匹配 or 也为真 因此继续处
  • 从 mysql 数据库回显特定行

    我创建了一个表单 要求用户添加 名字 姓氏 位置 状态 一段时间后我收到了 5 个输入 mysql表名为users 表数据如下 id first name location status 1 Chris UK Married 2 Anton
  • 有没有办法在打字稿中定义新的(而不是别名)类型?

    如果我定义以下类型 type seconds number type milliseconds number 类型只有aliases并且以下语法不会引发任何错误 var x seconds 1 var y milliseconds x 虽然
  • 如何将泛型类型参数传递给 lambda 表达式?

    我有一个 lambda 表达式 它接受int 可为空整数 如果值存在则返回值或DBNull Value http msdn microsoft com en us library system dbnull value aspx否则 Fun
  • 将图像传递到控制器 ASP.NET MVC

    我正在尝试将 Image 和 ImageName 从视图发送到控制器 这是我的控制器的外观 HttpPost public ActionResult Add BoxAddViewModel image TODO Add new box re
  • postgresql 错误 PANIC: 无法找到有效的检查点记录

    当我加载 postgres 服务器 v9 0 1 时 我会出现恐慌 导致其无法启动 PANIC 无法找到有效的检查点记录 我怎样才能解决这个问题 Postgres 正在事务日志中查找可能不存在或已损坏的检查点记录 在您继续之前 你必须意识到
  • 当延迟加载模块被销毁时采取行动

    我有一个 Angular 6 应用程序 我懒惰地加载模块并通过路由器传递一些数据 进入模块后 我调用共享服务中的一个方法 并将这些数据 配置内容 传递给该方法 当该模块被销毁时 本质上是当用户离开该路径时 我需要调用一个方法 但我只想调用它
  • __ptr32 和 __ptr64 有什么意义?

    如中所述这篇 MSDN 文章 http msdn microsoft com en us library aa985900 28v vs 80 29 aspx 微软有这两种类型注释来声明不同架构上的本机指针 然而 在第二行 在 32 位系统
  • 返回这个|| (0,eval)('这个');

    查看 doT js 源代码 https raw github com olado doT master doT js https raw github com olado doT master doT js 这是做什么的 function
  • json数组:如何创建新的数组元素?

    我的目标是得到一个像这样的 json 数组 var args name test value 1 key test2 value 2 我怎样才能得到下面的代码来构建像上面一样的数组 this dependentProperties arra
  • “read/1”调用后 SWI Prolog 回溯行为

    我在看另一个序言 https stackoverflow com questions 47317413 how to use user input in prolog to search在StackOverflow上提问并遇到这种情况 假设
  • 音隙不起作用

    我已经从其网站下载了phonegap示例 但它没有运行 我找不到原因 请帮助我获得解决方案 当我运行时它显示 无法加载位于 file andriod asset www index html 的网页 找不到所请求的文件 www index
  • 如何将SIRI集成到iPhone应用程序中? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发一个 iPad 应用程序
  • 如何在 jQuery Ajax 成功回调中处理我的 JSON 数据?

    如果我有一个ajax调用 ajax url url dataType json data data success function json data What s the efficient way to extract the JSO
  • Babel:ES6 中的函数参数类型

    如果我编写以下代码并将其转译为通天塔 6 5 0 它工作正常 function foo first string second number code here string and number刚刚从转译的 ES5 代码中删除 如果我使用
  • C#、F#、IronPython 和 IronRuby 的集成

    有人告诉我 由 C 和 F 源代码生成的程序集文件是可以互操作的 因为它们被编译成 NET 程序集 Q1 这是否意味着 C 可以像调用 C 函数一样调用 F 函数 Q2 IronPython 和 IronRuby 怎么样 我没有看到来自 I
  • 一个或多个数组的加权洗牌?

    使用嵌套数组中的权重对一个或多个数组进行混洗的好算法是什么 Example array array array name gt John rank gt 3 array name gt Bob rank gt 1 array name gt
  • 判断 __getattr__ 是方法还是属性调用

    有什么方法可以使用 getattr 确定方法和属性调用之间的区别吗 I e in class Bar object def getattr self name if THIS IS A METHOD CALL Handle method c