Python中对象和属性概念的混淆

2024-06-14 17:44:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在Pythondocumentation中,据说对象创建后,它有identity, typevalue。一旦创建了它,就不能更改标识和类型。你知道吗

只有当标识、类型和值相同时,is运算符才返回True。操作符==比较对象的值。你知道吗

  • 那么对象的属性是什么?

  • 对象和属性之间的联系是什么?

以下是我的假设:对象的属性实际上是在对象之间引用的。它表示对象的关系。一个对象的属性是另一个对象。它更像是一个“C”语言指针。你知道吗

是这样吗?你知道吗


Tags: 对象语言true类型属性关系isvalue
2条回答

首先你需要理解变量和对象的概念。你知道吗

在Python中,例如,当您执行x = 42时,您将执行两个操作。你知道吗

  1. 创建一个值为42且类型为int的对象并将其存储在内存中(在CPython中有一个小int的快捷方式,但是让我们考虑一下它对小int的行为与对任何类型的行为相同)。你知道吗
  2. 使用变量x引用该对象。你知道吗

Python variable资料来源:https://www.python-course.eu/images/python_variable_1.png

所以这个对象会有一个标识,它是一个数字标识,引用那个对象,并且只引用那个对象(在CPython中,这个数字是内存地址,但这是特定于实现的),一个类型,在我们的例子中是int,还有一个值,在我们的例子中是42。你知道吗

标识和类型永远不会更改,值将取决于对象类型本身。可变对象,如lists和dicts允许更改它们的值,而不必使用新值创建另一个对象,而ints、strs和tuples不允许更改它们的值,您将使用新值在另一个内存位置创建另一个对象。你知道吗

任何对象的属性都是根据其类型存储的不同信息。在我们的例子中,int只存储整数,但是可能有更复杂的类型存储更多的信息。例如,表示到HTTP服务器的连接的对象可能具有存储IP地址和端口的属性,或者连接到DB的类需要用户和密码。这些都是属性。我将使用一个表示动物的自定义创建类作为示例。你知道吗

class Animal:
    def __init__(self, legs, height):
        self.legs = legs
        self.height = height

dog = Animal(4, 0.5)
horse = Animal(4, 2)
spider = Animal(8, 0.01)

print("The height of a dog is "+str(dog.height)+" meters and has "+str(dog.legs)+" legs.")

在本例中,我们将有3个类型为Animal的对象,每个对象都有自己的id和两个属性,腿的数量和高度(以米为单位),值将是其所有属性的集合。我们还有3个变量(doghorse&;spider)引用/指向这些对象。然后我们在控制台中打印:

The height of a dog is 0.5 meters and has 4 legs.

print()函数中的str()函数返回其他类型为str的对象,其值为"0.5""4",这样我们就可以用+运算符连接所有的str。你知道吗

对于自定义(非内置)类,对象的“值”是所有属性值的总和,大致上是(或者说,对象的属性字典的值,可用作obj.__dict__)。属性如何准确地保存值(不管它是原语值本身,还是对另一个对象的引用)是一个实现细节,最终并不重要。对于内置类,文本将继续定义每个类的值。注意,这里的“值”是一个抽象概念,用于描述Python的行为,实际上并不是Python本身显式存在的东西。你知道吗

操作符==只调用__eq__方法;它旨在比较对象值,但没有义务这样做。你知道吗

相关问题 更多 >