【问题标题】:Objects vs instance in pythonpython中的对象与实例
【发布时间】:2011-09-16 03:23:31
【问题描述】:

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

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

查看this

我错了吗?

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

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

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

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

请参考this

【问题讨论】:

  • 你指的是pythonobject基类吗?
  • 不。只是普通对象与实例

标签: c++ python object


【解决方案1】:

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

实际上,这在 Python 中仍然被称为类。这就是为什么你这样定义它:

class Foo(object):
    pass

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

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

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

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 在多大程度上采用了“一切都是对象”的概念。

【讨论】:

    【解决方案2】:

    在术语方面,类和实例在 Python 中都称为 objects,但对于作为普通 Python 程序员的你来说,这并不重要。您可以看到 Python 的类和实例与 C++ 的类和实例非常相似:

    class MyClass:
      data = 1
    
    mc = MyClass()
    

    MyClass 是一个mc 是一个类MyClass实例


    虽然 Python 在本质上比 C++ 更动态,所以它的类也是对象。但这不是程序员通常会遇到的事情,所以你可以不用担心。

    【讨论】:

      【解决方案3】:

      一切 在 Python 中都是一个对象。甚至是作为元类实例的类。

      【讨论】:

      • 请用英语.. 非常感谢您提供示例。
      • 我不确定我的哪个词不是英语;想必你已经知道“实例”是什么意思了,"metaclass" 只是一个类,其实例就是类。
      【解决方案4】:

      既然你问的是“请用英语”,我会尽量简化,但不惜细节。

      我们先忽略类和实例,只看对象。

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

      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)
      

      class 是对如何构造新对象的描述(或配方,如果你愿意的话)。根据类描述构造的对象被称为属于该类。属于一个类的花哨名称是该类的 instance

      现在,我之前写过,在 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.
      

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

      【讨论】:

        【解决方案5】:

        在非常真实的意义上,Python 中的一切都是一个对象:一个类(或任何 type) 是对象,函数是对象,数字是对象... 每个对象都有一个类型。 “类型”是一种特定类型的对象(一个 类,如果您愿意),以及描述各种 类型的属性(函数等)。如果你习惯 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(函数也是对象),它调用函数。 (更一般地说,类型/类可能是可调用的,也可能不是;如果 在Toto 下的字典中找到Object 是可调用的,Python 解释器执行对象定义的“调用”的任何含义。种类 就像在 C++ 中重载 operator()() 一样。的过载 operator()() for Type 是构造该类型的新对象。)

        是的,如果你来自古典背景——严格的程序, 结构化的,完全编译的语言,在 首先。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-16
          • 1970-01-01
          • 1970-01-01
          • 2016-02-13
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多