对象与python中的实例

时间:2011-06-16 07:23:41

标签: c++ python object

在C ++中,只有对象和类,其中对象是类的实例。

在Python中,类定义(即类的主体)称为对象。 并且,C ++中的对象在python中称为实例。

检查this

我错了吗?

编辑:实际上,有人可以解释对象与实例的差异

编辑:在python中,一切都将继承自对象类&因此,一切都是一个对象(即对象类的对象)。

一个类也是一个对象(即对象类的对象)。

Instance是用于调用任何类对象的名称。(a.k.a c ++ object)。

请参阅this

5 个答案:

答案 0 :(得分:18)

  

在Python中,类定义(即类的主体)称为对象

实际上,这仍然被称为Python中的一个类。这就是你定义它的原因:

class Foo(object):
    pass

使用class关键字,因为结果仍称为类。

单词object在括号中,表示Foo派生自名为object的类。不要混淆 - 任何现有的类都可以在这里使用;事实上,不止一个。

您通常从object派生课程的原因是历史性事故,但可能值得详细说明。 Python的原始对象实现将用户定义的类和内置类型视为略有不同的类型。然后语言的设计者决定统一这两个概念。因此,派生自object(或来自object的后代)的类与派生自object的类的行为略有不同,并且被称为new式班。另一方面,旧式课程的定义如下:

class Foo:
    pass

class Bar(Foo):
    pass

请注意,这些不会从object继承,也不会从继承自object的任何其他内容继承。这使他们成为旧式的课程。

使用Python 2.x时,您的类几乎总是从object继承,因为新样式的对象可以通过几种小而重要的方式更好地工作。

为了进一步混淆,在Python 3.0及更高版本中,没有旧式类,因此您不必明确地从object派生。换句话说,所有上述类将是Python 3.x中的新式类。

现在,回到手头的问题。类对象,因为一切都是Python中的对象。列表,字典,整数,字符串,元组......所有这些都是对象,Python程序的构建块也是如此:模块,函数和类。您可以使用class关键字创建一个类,然后将其传递给函数,修改它等等。(为了完整性,您还可以使用type()函数创建一个类。)

类是构建对象的模板,称为实例。这部分你已经知道了。您实例化类似于调用函数的对象,传入初始值和其他参数:

mylist = list("abc")   # constructs ["a", "b", "c"]

在幕后,这会创建一个实例,然后调用新实例的__init__()方法来初始化它。因为一切都是Python中的对象,所以类的实例也是对象。

您可能想知道的最后一件事是,就像类是构建对象的模板一样,因此可以使用模板来构建类。这些被称为元类。基本元类称为type(即,普通的新式类是type的实例)。

(是的,这与前面提到的type相同,可以用来创建类,你可以调用它来创建类的原因是它是一个元类。)

要创建自己的元类,可以从type得到它,如下所示:

class mymeta(type):
    pass

元类是一个相当高级的Python主题,所以我不会介绍你可能会使用它们或者如何使用它们,但是它们应该清楚Python在多大程度上采用“一切都是对象”的概念。

答案 1 :(得分:6)

Python中的

Everything 是一个对象。甚至是类,它们是元类的实例。

答案 2 :(得分:6)

术语方面,类和实例在Python中都称为对象,但作为常规Python程序员,这并不重要。你可以看到Python的类和实例几乎就像C ++的类和实例一样:

class MyClass:
  data = 1

mc = MyClass()

MyClassmc是类MyClass实例


Python本质上比C ++更具动态性,因此它的类也是对象。但这不是程序员通常所接触到的,所以你可以不用担心它。

答案 3 :(得分:1)

从一个非常真实的意义上说,Python中的所有东西都是一个对象:一个类(或任何类 type)是一个对象,一个是一个对象,一个是一个对象... 每个对象都有一个类型。 “类型”是特定类型的对象(a 如果您愿意,可以使用附加数据来描述各种类型 类型的属性(函数等)。如果您已经习惯了C ++,那么 可以把它想象成:

struct Type;

struct Object  //  The base class of everything.
{
    Type* myType;
    //  Some additional stuff, support for reference counting, etc.
};

struct Type : Object
{
    //  Lots of additional stuff defining type attributes...
};

当你在Python中定义一个新类时,你真的只是在创建一个新类 类型的实例;当你实例化那个类时,Python会初始化 myType成员,指向正确的Type实例。

但请注意,一切都是动态的。定义类型时 Toto(通过执行类定义 - 甚至定义类型是一个 运行时事物,不是编译时间,如在C ++中),Python解释器 创建Type的实例,并将其放入字典中 (map<string, Object*>,用C ++的说法)某处。当翻译 遇到如下声明:

x = Toto()

,它在字典中查找Toto:如果提到的Object有 类型Type,它构造该对象的新实例(如果有) 类型Function(函数也是对象),它调用函数。 (更一般地说,类型/类可以是可调用的;如果类型是 在Object下的字典中找到的Toto是可调用的,Python 解释器执行对象定义的“调用”的意思。分类 喜欢在C ++中重载operator()()。超载 operator()()的{​​{1}}是构造该类型的新对象。)

是的,如果你来自古典背景 - 严格程序, 结构化,完全编译的语言,它可能会令人困惑 第一

答案 4 :(得分:1)

既然你要求“请英语”,我会尽量以牺牲细节为代价。

首先让我们忽略类和实例,然后只看对象。

Python 对象包含数据函数,就像其他所有面向对象编程语言中的对象一样。附加到对象的函数称为方法

x = "hello" #now x is an object that contains the letters in "hello" as data
print x.size() #but x also has methods, for example size()
print "hello".size() #In python, unlike C++, everything is an object, so a string literal has methods.
print (5).bit_length() #as do integers (bit_length only works in 2.7+ and 3.1+, though)

是如何构造新对象的描述(或配方,如果你愿意)。根据类描述构造的对象被认为属于该类。属于某个类的奇特名称是该类的实例

现在,早些时候我在Python中写道,一切都是对象。嗯,这适用于函数和类等东西。因此,如何制作新对象的描述本身就是一个对象。

class C: #C is a class and an object
  a = 1

x1 = C() #x1 is now an instance of C
print x1.a #and x1 will contain an object a

y = C #Since C is itself an object, it is perfectly ok to assign it to y, note the lack of ()
x2 = y() #and now we can make instances of C, using y instead.
print x2.a #x2 will also contain an object a

print C #since classes are objects, you can print them
print y #y is the same as C.
print y == C #really the same.
print y is C #exactly the same.

这意味着您可以像处理其他所有类一样处理类(和函数),例如,将它们作为参数发送给函数,函数可以使用它们来构造一个从未知道的类的新对象。