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

确定__getattr__是方法调用还是属性调用

云煌
2023-03-14
问题内容

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

即在:

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__挂钩中如何使用对象。例如,您可以在不调用方法的情况下访问方法,将它们存储在变量中,然后 调用它们。

返回带有__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)

但是它的实例与字符串或列表不能同时使用。

演示:

>>> 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!


 类似资料:
  • 问题内容: 有没有办法找出采用varargs的Java函数(或构造函数)是否实际上是用varargs或数组调用的? 说我有以下几点: 构造函数可以用单个参数调用,以后可以更改,如果我不复制构造函数中的数组,这些更改也将应用于成员变量,对吗?但是,如果用几个s 调用构造函数,则没有其他对array *的引用可以在类之外稍后对其进行更改,因此我可以直接对其进行分配。我可以告诉构造函数(或通常带有var

  • 问题内容: 我有一个包裹在另一个里面的物体。“包装器”通过重写从“包装”对象访问属性。直到我需要重写子类上的属性,然后使用来从基类访问该属性之前,此方法都有效。 我仍然可以直接从中访问属性,但是为什么不起作用? 问题答案: 据此, super不允许隐式调用诸如的“ hook”函数。我不确定为什么要用这种方式实现(这可能是一个很好的理由,并且由于超级对象具有自定义和方法,所以事情已经很混乱了),但似

  • 问题内容: 我将从服务器接收JSON对象或数组,但是我不知道它将是什么。我需要使用JSON,但是要这样做,我需要知道它是对象还是数组。 我正在使用Android。 有没有人有这样做的好方法? 问题答案: 我找到了更好的方法来确定: tokenizer可以返回更多类型:http : //developer.android.com/reference/org/json/JSONTokener.html

  • 问题内容: 我试图通过反射获取静态私有属性的值,但失败并显示错误。 我得到的异常是: 而且,我需要使用以下代码来调用一个私有的。 但是问题是Student类是单例类,并且构造函数是私有的,并且无法访问。 问题答案: 您可以将字段设置为可访问:

  • 问题内容: 我读这个和这个,结果发现,在课堂上我需要保存到类的引用,当东西在发生类,我们执行由类的接口中定义的方法工具。好吧,我明白了。我以不同的方式使用接口来调用回调: 我发现这种方式更具可读性,更容易理解,但是不确定这是否是不好的做法。因此,我可以随意走这条路吗? 问题答案: 所以我可以随意走这条路吗? 这种方式不是很正确。 您在说的是称为Observer或/ 模式。 简而言之:订户想要从发布

  • 我读了这篇文章和这篇文章,发现在类中,我需要保存对类的引用,当类中发生一些事情时,我们执行一个由类实现的接口定义的方法。不知何故我明白了。我以不同的方式使用接口来调用回调: 我发现这种方式更易读,更容易理解,但不确定这是否是一个不好的做法。所以我可以自由地走得更远吗?

  • 关于SpringWebFlux的小问题,以及如何“链接”http调用。 通过一个具体的例子,这里是一个非常简单的SpringMVC示例,带有一个rest模板。 在这个片段中,我们看到了非常简单的内容。仅初始化一个rest模板。 超文本传输协议请求有效载荷对象的构造。 使用所构建的对象来查询第一外部web应用API以获得响应。 重要的是,需要第一个HTTP调用的响应来进行第二个HTTP调用。它们只能