0

我之前一直在使用 AS3,并且喜欢它的语法,例如关键字as.

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

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

4

6 回答 6

5

If you were to translate this literally, you'd end up with

cat if isinstance(cat, Animal) else None

However, that's not a common idiom.

How am I suppose to do the above in Python?

I'd say you're not supposed to do this in Python in general, especially not for documentation purposes.

于 2013-07-14T08:22:47.557 回答
0

__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.

于 2013-07-14T08:54:32.273 回答
0

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

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

换句话说,您可以使用instance.__class__来查看实例的确切类以及该类class.__bases__的超类。

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

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

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

于 2013-07-14T07:48:40.520 回答
0

您正在寻找 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 中使用。

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

于 2013-07-14T07:49:35.867 回答
0

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

于 2013-07-14T07:53:58.307 回答
0

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

于 2013-07-14T07:54:07.310 回答