【问题标题】:What is the python way to declare an existing object as an instance of a class?将现有对象声明为类的实例的python方法是什么?
【发布时间】:2013-07-12 07:54:13
【问题描述】:

之前用过AS3,喜欢它的语法,比如关键字as

例如,如果我在编辑器中键入 (cat as Animal) 并按下 .,编辑器将足够聪明地为我提供 Animal 类的代码提示,无论 cat 实际上是什么类型,并且代码很好地描述了自己。

Python 是一门美丽的语言。我应该如何在 Python 中执行上述操作?

【问题讨论】:

  • How to cast object in Python 的可能重复项
  • Python 没有严格的变量类型,因此无法表示给定变量具有给定类型。如果只有一种可能性,一些 IDE 可能足够聪明地推断出对象的类型,但语言中没有任何东西可以明确支持这一点(以及许多不可能的情况)。
  • 您可能还想看看 iPython 和/或一些 IDE,例如能够为您提供上下文补全的 IDE。
  • @Blckknght 谢谢,在您的描述之后,我能够找到这个答案link。对我来说已经足够了。

标签: python


【解决方案1】:

如果你要按字面翻译,你会得到

cat if isinstance(cat, Animal) else None

但是,这不是一个常见的成语。

我想如何在 Python 中完成上述操作?

我会说一般来说你不应该在 Python 中这样做,尤其是不用于文档目的。

【讨论】:

    【解决方案2】:

    在 Python 中,对象被创建为类的实例,您不能将现有对象声明为类的实例。由于类有__init__ 方法,初始化是类实例的本质。

    【讨论】:

      【解决方案3】:

      您正在寻找 Python 中的多态行为。

      它的工作方式与其他语言(如 Java)不同 - 我们拥有的是 isinstance()

      导致

      class FirstObject(object):
          #someStuff
      
      class SecondObject(FirstObject):
          #someStuff
      
      >> someObject = SecondObject()
      >> isinstance(someObject, SecondObject)
      >> true
      

      同样的

      >> isinstance(someObject, FirstObject)
      >> true
      

      如何使用点表示法是一种称为方法解析顺序或 MRO 的东西,它在类声明中“从左到右”查找方法。 该功能在 shell ATM 中不可用,但计划在即将发布的 Python 版本中使用。

      在写这篇文章时,我发现 this SO question - 使我的答案没有实际意义。

      【讨论】:

        【解决方案4】:

        在某些情况下,您可以通过设置对象的__class__ 属性来更改对象现有实例的类:

        class Foo(object):
            @property
            def myname(self):
                return "I'm a Foo"
        
        class Bar(object):
            @property
            def myname(self):
                return "I'm a Bar"
        
        
        thing = Foo()
        
        print thing.myname
        
        thing.__class__ = Bar
        
        print thing.myname
        

        我认为这只适用于派生自object 的“新式”Python 类的成员。

        【讨论】:

          【解决方案5】:

          您正在寻找一种方法来检查实例的类。

          isinstance(instance, class) 是个不错的选择。它告诉您实例是属于某个类还是属于该类的子类的实例。

          另外,您可以使用instance.__class__ 查看实例的确切类,使用class.__bases__ 查看该类的超类。

          对于生成器或函数等内置类型,您可以使用inspect 模块。

          python 中的名称没有类型。所以不需要进行强制转换,作为回报,确定实例的类型是一个不错的选择。

          至于提示功能,它是编辑器或 IDE 的功能,而不是 Python。

          【讨论】:

          • 这要么是开玩笑的评论,要么与发布者想要的答案相去甚远。
          • 我误解了 OP 的意思。现在我更新了我的答案。 @phant0m
          • 更新了我的答案。 @MarkAmery
          • @zhangyangyu 我不知道 AS3,但谷歌搜索 as 运算符显示它是一个铸造运算符;我认为 AS3 中的 (cat as Animal) 大致相当于 C、C++ 或 Objective-C 中的 (Animal)cat。这仍然不是您所回答的。
          • 在 Python 中,变量没有类型。所以在很大程度上,他想要的功能是不需要的。作为回报,我认为检查类的类型是最好的选择。@MarkAmery
          【解决方案6】:

          Python 没有类型声明。如果catAnimal,您可以将其用作Animal,它会起作用。您不必像在静态类型语言中那样将其转换为 Animal 类型的表达式。不幸的是,这也意味着很难提供代码补全,因为您的所有 IDE 都知道,cat 可能是 Nacho

          【讨论】:

          • 完全合理。我的猫经常吃玉米片。
          • Python 是“严格类型”是什么意思?你的意思是静态类型的吗?
          猜你喜欢
          • 2013-01-16
          • 2019-08-01
          • 2017-05-05
          • 2021-11-15
          • 1970-01-01
          • 1970-01-01
          • 2019-12-10
          • 1970-01-01
          相关资源
          最近更新 更多