【问题标题】:Python class that inherits from itself? How does this work?从自身继承的Python类?这是如何运作的?
【发布时间】:2011-01-05 22:10:41
【问题描述】:

对 Python 来说相对较新,我在 PyFacebook 库中看到了以下构造(来源:http://github.com/sciyoshi/pyfacebook/blob/master/facebook/init.py#L660)。我很好奇这是做什么的,因为它似乎是一个从自身继承的类。

class AuthProxy(AuthProxy):
    """Special proxy for facebook.auth."""

    def getSession(self):
        """Facebook API call. See http://developers.facebook.com/documentation.php?v=1.0&method=auth.getSession"""
        ...
        return result

    def createToken(self):
        """Facebook API call. See http://developers.facebook.com/documentation.php?v=1.0&method=auth.createToken"""
        ...
        return token

这是在做什么?

切线相关,我在 Eclipse 中使用 PyDev,它将此标记为错误。我猜情况并非如此。无论如何让 Eclipse 知道这很好?

【问题讨论】:

  • 猴子补丁,python 方式。

标签: python eclipse facebook


【解决方案1】:

那里的class语句并没有让类继承自自身,它创建了一个以AuthProxy当前值作为超类的类对象,然后将该类对象赋值给变量'AuthProxy',大概会覆盖之前赋值的它继承自的 AuthProxy。

本质上,它与x = f(x) 大致相同:x 不是 f 自身的值,没有循环依赖——只有旧的 x 和新的 x。旧的 AuthProxy 和新的 AuthProxy。

【讨论】:

  • 如果是这样的话,原来的“AuthProxy”类是从哪里来的?该类没有导入,虽然我可能认为 AuthProxy 是一些通用类,但相同的模式用于“FriendsProxy”和“PhotosProxy”。
  • 这绝对令人困惑。不要这样做。它肯定是在某个地方进口的;在此定义之前粘贴“print AuthProxy.__module__”以查看它的来源。
【解决方案2】:

它使用从不同模块导入的 AuthProxy(检查您的导入)并从它派生。

【讨论】:

  • 如果是这种情况(很可能是这样),这是一个 strong 论据,用于执行 import other_module 然后说 class AuthProxy(other_module.AuthProxy)。这可以防止对本地模块的命名空间造成污染,并且突出了这样一个事实,即似乎具有相同名称的两个事物是不同的事物。
  • 另一个选项是import other_module.AuthProxy as OtherAuthProxyclass AuthProxy(OtherAuthProxy)
  • 这两种解决方案都可能会修复 PyDev 错误报告问题。
  • 您能否查看源代码(链接在原始问题中)并解释其他 AuthProxy 类的来源?还是 FriendsProxy 或 PhotosProxy 类,它们使用相同的模式?
【解决方案3】:

“前”AuthProxy 是由__generate_proxies 创建的(这不是很好的代码,其中甚至还有execeval :)),但作者还想在其上定义一些方法.

【讨论】:

  • 这就像我嘴里有一个派对,每个人都在呕吐。
【解决方案4】:

要让 Eclipse 停止抱怨,请执行以下操作:

类 AuthProxy(AuthProxy): #@UndefinedVariable

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 2018-03-10
    • 2021-05-16
    • 2018-10-30
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多