【问题标题】:What is an Object in Python?Python中的对象是什么?
【发布时间】:2019-10-12 02:04:37
【问题描述】:

我很惊讶我的问题以前没有被问过(措辞如上)。我希望有人可以在像 Python 这样的 OOP 语言的上下文中分解这个基本术语“对象”。以像我这样的初学者能够掌握的方式进行解释。

当我在 Google 上输入我的问题时,出现的第一个帖子是 here

这是定义: 使用类的构造函数创建对象。然后这个对象将被称为类的实例。

Wikipedia 是这样定义的: 对象是类的一个实例。对象是一种抽象。它们既拥有数据,又拥有处理数据的方法。数据通常在对象之外不可见。

我希望有人可以帮助我打破这个重要的概念,或者向我指出更多资源。谢谢!

【问题讨论】:

  • 这个问题太笼统了。答案可以从单个段落到博客文章。请做一些阅读,尤其是从文档中。简而言之,object是python中最基本的类型;您将与之交互的一切都是某种具有更具体属性和行为的对象。
  • 我同意这个问题很广泛:规范的答案是Python data model。不过,我想听听 O.P. 是否可以缩小他们的要求范围。
  • 大家好,我真的很感谢你们的 cmets,我现在明白了,它是多么含糊。不幸的是,我在编程方面的词汇仍然很初级,因此无法在你们通常交流的水平上表达自己。我将在下面接受小次郎的回答,因为它实际上是我正在寻找的。我的结论是“对象”是基本的,但可以非常深入,并且现在会更轻松地找到明确的答案。谢谢大家!

标签: python oop object


【解决方案1】:

一切都是对象

对象是面向对象语言的基本构建块。整数、字符串、浮点数,甚至数组和字典,都是对象。更具体地说,任何单个整数或任何单个字符串都是对象。数字 12 是一个对象,字符串“hello, world”是一个对象,列表是一个可以容纳其他对象的对象,等等。您一直在使用对象,甚至可能没有意识到这一点。

对象有类型

每个对象都有一个类型,该类型定义了您可以对对象执行的操作。例如,int 类型定义了当您向 int 添加内容时会发生什么,当您尝试将其转换为字符串时会发生什么,等等。

从概念上讲,如果不是字面意思,type 的另一个词是 class。当你定义一个类时,你本质上是在定义你自己的类型。就像12 是整数的实例,"hello world" 是字符串的实例一样,您可以创建自己的自定义类型,然后创建该类型的实例。每个实例都是一个对象。

类只是自定义类型

除了在显示器上打印字符串之外,大多数程序需要管理的不仅仅是数字和字符串。例如,您可能正在编写一个处理图片的程序,例如 Photoshop。或者,也许您正在创建 iTunes 的竞争对手,并且需要操作歌曲和歌曲集。或者,也许您正在编写一个程序来管理食谱。

一张图片、一首歌或一个食谱都是特定类型的对象。唯一的区别是,您的对象不是语言提供的类型(例如:整数、字符串等),而是您自己定义的东西。

【讨论】:

  • 嗨,布莱恩,这也很有帮助,感谢您的回答!
  • 谢谢。是否有 Python 中不是对象的示例? (也许在 Python 2 中有一些非对象?)
【解决方案2】:

要深入,你需要了解Python data model

但是,如果您想要一份光鲜的 stackoverflow 备忘单,让我们从字典开始吧。 (为了避免循环定义,让我们同意,字典至少是键到值的映射。在这种情况下,我们甚至可以说键绝对是字符串。)

def some_method():
    return 'hello world'

some_dictionary = {
    "a_data_key": "a value",
    "a_method_key": some_method,
}

那么,对象就是这样的映射,带有一些额外的语法糖,允许您使用点符号访问“键”。

现在,它的意义远不止于此。 (事实上​​,如果你想在 python 之外理解这个,我推荐The Art of the Metaobject Protocol。)你必须跟进“但是什么是实例?”和“你怎么能对这样的字典中的条目进行 iterate 之类的操作?”和“什么是类型系统”? Skam 的好答案中解决了其中一些问题。

我们可以讨论一下 python dunder 方法,以及它们如何基本上是实现本机行为的协议,例如 sized(有长度的东西)、可比较类型 (x

但由于这个问题基本上是博士级别的宽泛问题,我想我的回答会非常简化,看看你是否想限制这个问题。

【讨论】:

  • 嗨 kojiro,这有助于指出我可以阅读更多内容的方向(尤其是关于 Python 的数据模式) - 已经在 Mark Lutz 的书中读到了这一点,但是无法画出连接。但是,您的回答有助于确认我的方向。非常感谢。
  • 谢谢。从链接中我可以看到一个函数、一个对象方法、一个类和一个模块都是对象。你知道什么不是对象的例子吗? (type 似乎也是一个对象,也许 Python 2 发生了一些变化?)
  • 在 Python 中实际上没有任何可引用的东西不是对象。我真的不认为这自 Python 2 以来发生了很大变化。
【解决方案3】:

我认为 O.P. 有一个非常好的问题。对象是一个应该带有定义的词。我发现这个让我的事情变得更简单了。也许它会帮助你对对象是什么有一个大致的概念。

对象:对象是将变量和函数封装到单个实体中。对象从类中获取它们的变量和函数。类本质上是创建对象的模板。

请参阅:https://www.learnpython.org/en/Classes_and_Objects 了解更多信息。

这可能不是一个完整的定义,但它是我可以理解和使用的概念。

【讨论】:

    【解决方案4】:

    在 Python 和所有其他面向对象编程 (OOP) 语言的上下文中,对象具有两个主要特征:状态和行为。

    您可以将构造函数视为创建具有状态和行为的对象实例的工厂。

    State - Any instance or class variables associated to that object.

    Behavior - Any instance or class methods

    以下是 Python 中的一个类示例,用于说明其中的一些概念。

    class Dog:
        SOUND = 'woof'
        def __init__(self, name):
            """Creates a new instance of the Dog class.
    
            This is the constructor in Python.
            The underscores are pronounced dunder so this function is called
            dunder init.
            """ 
            # this is an instance variable.
            # every time you instantiate an object (call the constructor)
            # you must provide a name for the dog
            self._name = name
    
        def name(self):
            """Gets the name of the dog."""
            return self._name
    
        @classmethod
        def bork(cls):
            """Makes the noise Dogs do.
    
            Look past the @classmethod as this is a more advanced feature of Python.
            Just know that this is how you would create a class method in Python.
            This is a little hairy.
            """
            print(cls.SOUND)
    

    虽然我同意 cmets 这个问题有点含糊。请更具体一点,但我提供的答案是对 Python 中的类和对象的快速概述。

    【讨论】:

    • self.SOUND 将创建一个 instance 变量。
    • 嘿,我赞成这个覆盖 statebehavior,特别是对象的 instances,它们是最基本的例子,我对自己没有在回答中涵盖这一点感到有些恼火。
    • 感谢 Skam,也感谢这个答案!抱歉无法更恰当地定义我的问题。
    • __init__ 不是构造函数。您不能将 self 传递给构造函数,因为构造函数会创建 self 引用的对象。实例由__new__创建,__init__初始化属性。
    【解决方案5】:
    • 对象只是数据(变量)和作用于数据的方法(函数)的集合。

    • 类是该对象的蓝图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 2017-11-15
      • 2020-10-02
      • 2014-06-05
      相关资源
      最近更新 更多