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

时间:2013-07-14 07:46:13

标签: python

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

例如,如果我在编辑器中键入(cat as Animal)并按.,编辑器将足够智能,无论类型{{Animal如何,都可以为我提供代码提示cat 1}}实际上是,并且代码描述得很好。

Python是一门优美的语言。我怎么想在Python中执行上述操作?

6 个答案:

答案 0 :(得分:5)

如果你要按字面意思翻译,你最终会得到

cat if isinstance(cat, Animal) else None

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

  

我怎么想在Python中执行上述操作?

我会说你不应该在Python中这样做,尤其不是为了文档目的。

答案 1 :(得分:0)

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

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

另一方面,您可以使用instance.__class__查看实例所在的确切类,并使用class.__bases__查看该类的超类。

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

python中的名称没有获得类型。所以不需要进行强制转换,反过来确定实例的类型是一个不错的选择。

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

答案 2 :(得分: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版本中使用。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

Python没有类型声明。如果catAnimal,您只需将其用作Animal即可。您不必像使用静态类型语言那样将其强制转换为Animal类型的表达式。不幸的是,这也意味着很难提供代码完成,因为对于您的所有IDE都知道,cat可能是Nacho

答案 5 :(得分: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的“新式”Python类的成员。