我之前一直在使用 AS3,并且喜欢它的语法,例如关键字as
.
例如,如果我在编辑器中键入(cat as Animal)
并按下,无论实际是什么类型.
,编辑器都会足够聪明地为我提供类的代码提示,并且代码可以很好地描述自己。Animal
cat
Python 是一门美丽的语言。我应该如何在 Python 中执行上述操作?
我之前一直在使用 AS3,并且喜欢它的语法,例如关键字as
.
例如,如果我在编辑器中键入(cat as Animal)
并按下,无论实际是什么类型.
,编辑器都会足够聪明地为我提供类的代码提示,并且代码可以很好地描述自己。Animal
cat
Python 是一门美丽的语言。我应该如何在 Python 中执行上述操作?
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.
__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
.
您正在寻找一种检查实例类的方法。
isinstance(instance, class)
是一个不错的选择。它告诉您该实例是属于一个类还是属于该类的子类的一个实例。
换句话说,您可以使用instance.__class__
来查看实例的确切类以及该类class.__bases__
的超类。
对于生成器或函数等内置类型,您可以使用inspect
模块。
python 中的名称没有类型。所以不需要进行强制转换,作为回报,确定实例的类型是一个不错的选择。
至于提示功能,它是编辑器或 IDE 的功能,而不是 Python。
您正在寻找 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 - 使我的答案没有实际意义。
在 Python 中,对象被创建为类的实例,您不能将现有对象声明为类的实例。由于类有__init__
方法,初始化是类实例的本质。
Python 没有类型声明。如果cat
是一个Animal
,你可以把它当作一个Animal
,它会工作。您不必Animal
像在静态类型语言中那样将其转换为 type 的表达式。不幸的是,这也意味着很难提供代码补全,因为你的 IDE 都知道,cat
它可能是一个Nacho
.