Python 一个类的价值是什么?

Python 一个类的价值是什么?,python,Python,在中,每个对象都有一个类型、一个标识和一个值: 每个对象都有一个标识、一个类型和一个值 对于这些实例,它们看起来很简单: x = 10 # type(x) = int, id(x) = some address, value = 10 至少,我怀疑value=10是真的 对于类,类型和id也很容易找到: class Foo: def __init__(self, a): self.a = a # type(Foo) = type # id(Foo) = some ad

在中,每个对象都有一个类型、一个标识和一个值:

每个对象都有一个标识、一个类型和一个值

对于这些实例,它们看起来很简单:

x = 10
# type(x) = int, id(x) = some address, value = 10
至少,我怀疑
value=10
是真的

对于类,
类型
id
也很容易找到:

class Foo:
    def __init__(self, a):
        self.a = a

# type(Foo) = type
# id(Foo) = some address

但是,这个对象的价值是什么?它的属性和方法?

Python语言参考没有费心定义“值”的概念,只留下一个模糊、直观的概念。试图将这个概念应用到不直观的地方是行不通的,Python语言引用本身也没有这样做


如果你真的想选择一些东西来调用
Foo
的“value”,你可以说这个值是“一个用户定义的类型,带有基类
对象
,还有一个方法
\uuuu init\uuuu
,它接受一个名为
a
的参数,并将它赋给
self
a
属性,但是,作为概念模型的一部分,或者作为与其他人交流的工具,这是没有用的。

我认为一个对象的“值”的通常含义足以决定它的属性是否与同类型的另一个对象相比较:

>>> x = {1, 2, 3}
>>> y = {1, 2, 3}
>>> id(x) == id(y)
False
>>> x == y
True
在此示例中,集合
x
y
具有相同的值和相同的类,但具有不同的标识

>>> class Foo:
...     def __eq__(self, other):
...         return id(self) == id(other)
... 
>>> f = Foo()
>>> f.x = 1
>>> g = Foo()
>>> g.x = 1
>>> f == g
False
>>> h = f
>>> id(h) == id(f)
True
>>> h == f
True
在这种情况下,
f
g
具有相同的类型,但具有不同的标识和不同的值(即使它们的所有属性都相同)
f
h
具有相同的标识和值


(顺便说一句,我们已经使
\uuuu eq\uuu
方法简单地总是返回
False
,因此
h
f
——或者就此而言
f
f
——具有相同的身份,但不同的值,但我认为这样一个破碎的平等定义在实践中会在某些地方被打破我认为,只有当我们能够将价值的概念与另一个对象进行比较时,价值的概念才有意义。官方的Python 3:

章 声明对象具有值(除类型和标识外)。 对象的值在Python中是一个相当抽象的概念:例如 例如,没有对象值的规范访问方法。 此外,不要求对象的值为 以特定方式构造,例如由其所有数据组成 属性。比较运算符实现了什么的特定概念 一个对象的值是。人们可以把它们看作是定义值 通过对象的比较实现来间接地定义对象

值的概念甚至与类型正交:

>>> x = 1
>>> y = 1.0
>>> x == y
True         # Therefore x and y have the same value, although of different types
因此,如果一个对象的值只能通过相等性测试来检查,那么我们必须承认一个类对象的值与其标识是无法区分的。证明:

>>> def make_class():
...     class A: pass
...     return A
... 
>>> a1 = make_class()
>>> a2 = make_class()
>>> id(a1) == id(a2)
False
>>> a1 == a2
False

在上面的示例中,函数
make_class()
在每次调用时都会创建一个新的类对象。从语义上讲,这些类对象应该是相同的(即使它们被定义为非空)。仍然是来自
make_class()的不同调用的对象
函数不进行相等比较,因此假设它们的值不相等,仅仅因为它们具有不同的标识。

参考手册有点间接地指出,该值是每种类型各自定义的一个概念(重点增加):

对象的类型决定了对象支持的操作(例如,“它有长度吗?”)并定义了该类型对象的可能值

换言之,“值”是什么没有一般的概念。每种类型都为自己定义了“值”对该类型对象的含义。通常,“值”的概念与相等的概念相联系;对象被认为具有“相同的值”如果比较相等,那么类型可以通过定义
\uuuu eq\uu
方法来指定其值的概念


因此,为了回答您关于类的特定问题:从这个意义上说,类对象的值就是它本身,因为类对象是通过对象标识进行比较的,没有两个类对象是相等的。

您能添加一个链接到“每个对象都有一个类型、标识和值”的语句吗。我想知道提到它的背景:)@MSeifert是的,我添加了它。谢谢