将现有对象声明为类的实例的python方法是什么?

What is the python way to declare an existing object as an instance of a class?

我以前用过as3,喜欢它的语法,比如关键字as

例如,如果我在编辑器中键入(cat as Animal)并按.,编辑器将足够聪明,为类Animal提供代码提示,不管实际是什么类型的cat,代码描述得很好。

Python是一种美丽的语言。我应该如何在python中完成上述操作?


如果你真的要把这个翻译出来,你最终会

1
cat if isinstance(cat, Animal) else None

然而,这不是一个常见的习语。

How am I suppose to do the above in Python?

我想说,一般情况下,您不应该在Python中这样做,尤其是出于文档目的。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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类的成员。


python没有类型声明。如果catAnimal的话,你可以把它当作Animal来使用,它会起作用的。您不必像在静态类型语言中那样将它强制转换为Animal类型的表达式。不幸的是,这也意味着很难提供代码完成,因为据您的IDE所知,cat可能是Nacho


在Python中,对象被创建为类的实例,不能将现有对象声明为类的实例。由于类具有__init__方法,因此初始化对于类实例来说非常重要。


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

它并不像Java那样的其他语言工作——我们所拥有的是EDCOX1(4)。

从而导致

1
2
3
4
5
6
7
8
9
class FirstObject(object):
    #someStuff

class SecondObject(FirstObject):
    #someStuff

>> someObject = SecondObject()
>> isinstance(someObject, SecondObject)
>> true

同样适用于

1
2
>> isinstance(someObject, FirstObject)
>> true

它是如何用点表示法工作的,称为方法解析顺序(MRO),它在类声明中查找"从左到右"的方法。这个特性在shell atm中不可用,但计划在即将发布的python中使用。

写这篇文章时,我发现这个问题让我的答案变得毫无意义。


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

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

另一种方法是,您可以使用instance.__class__查看实例所在的类,使用class.__bases__查看类的超类。

对于诸如生成器或函数之类的内置类型,可以使用inspect模块。

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

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