【问题标题】:User defined object as function specified parameter type in Python用户定义的对象作为 Python 中函数指定的参数类型
【发布时间】:2019-03-22 05:24:27
【问题描述】:

我在 Python3 中定义了我的 Player 类,现在我试图在另一个类中定义一个方法,该方法将对象类型 Player 作为参数,因此代码如下所示:

def change_player_activity(self, player: Player):
    pass

但这给了我一个错误。我知道我可以执行以下操作:

if not isinstance(player,Player):
        raise TypeError

但我只是想知道,是否有任何内置方法告诉 Python3 只接受给定类的对象?

【问题讨论】:

  • “但这给了我一个错误。”什么样的错误?
  • 没有。 Python 不是 C 或 Java 或任何其他静态类型语言。类型提示只是提示。您可以使用isinstance 检查类型,或者如果您真的想尝试一下,可以使用元类

标签: python function class oop parameter-passing


【解决方案1】:

是否有任何内置方法告诉 Python3 接受给定类的对象?

没有。

这不存在,而且无论如何也不会有用,因为 Python 依赖于 Duck Typing 的原理。如果它看起来像Player,并且嘎嘎叫像Player,则将其视为播放器。否则,raise TypeError

只有当您要求对象执行 Player 应该能够执行的操作时,您才应该提升 TypeError,但它不能执行此操作。如果有人想将他们自己的 Player 类的实例传递给您的函数怎么办?那就不行了。


回到您的实际问题:您想在定义 Player 之前键入提示 Player。这样做的方法是在类型提示中write "Player" instead of Player

def change_player_activity(self, player: "Player"):
    pass

__future__(双关语)中,Python 开发人员计划使其成为not try to look up type hints straight away,因为这种事情很痛苦。

【讨论】:

  • 取决于您所说的“拥有Player 类”,这已经处理好了。 Player 的子类的一个实例,在任何有意义的意义上,仍然是一个 Player 的实例。
  • @chepner 我的意思是不是子类;这样做是有原因的,例如避免元类的丑陋。
  • 同样有充分的理由相信这样的课程不像“真正的”Player 那样嘎嘎作响,不能被视为有效的替代品。
  • @chepner 在这种情况下,某些呼叫或其他呼叫将失败。然后你可以提出TypeError。每次调用都缓慢检查isinstance 效率不高。
  • 我认为我们同意。如果使用isinstance,则应该影响函数处理参数的方式,而不是简单地决定是否引发TypeError(或其他一些异常)。我认为在动态类型语言中,调用者有责任传递正确类型的值,而不是被调用者有责任拒绝错误类型的值。类型提示是在后一种情况下提供帮助的工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 2020-11-09
  • 1970-01-01
相关资源
最近更新 更多