一堂课的价值是多少?

时间:2017-03-10 17:25:08

标签: python

reference manual中声明每个对象都有类型,身份和值:

  

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

例如,这些看起来很简单:

x = 10
# type(x) = int, id(x) = some address, value = 10

至少,我怀疑 value=10是真的。

对于课程,typeid再次易于查找:

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

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

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

4 个答案:

答案 0 :(得分:4)

Python语言参考并不打算定义“价值”的概念,而是留下一个模糊,直观的概念。试图将这个概念应用到它变得不直观的地方并不能很好地工作,而且Python语言参考本身也不会尝试。

如果你真的想选择一些东西来调用Foo的“值”,你可以说这个值是“一个基类object的用户定义类型和一个方法{{1 },它接受​​一个名为__init__的参数并将其分配给a的{​​{1}}属性,但这不会作为概念模型的一部分或作为工具的一部分用与其他人沟通。

答案 1 :(得分:3)

我相信"价值的通常含义"一个对象足以确定它是否与同一类型的另一个对象相等:

>>> x = {1, 2, 3}
>>> y = {1, 2, 3}
>>> id(x) == id(y)
False
>>> x == y
True

在此示例中,集xy具有相同的值和相同的类但身份不同。

>>> 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

在这种情况下,fg具有相同的类型,但身份和身份不同(即使所有属性都相同)。 fh具有相同的身份和价值。

(顺便提一下,我们已经使__eq__方法始终只返回False,因此hf - 或者ff {1}} - 具有相同的身份但具有不同的值,但我想在实践中某些地方会破坏这样一个破碎的等式定义。平等应该是equivalence relation。)

答案 2 :(得分:1)

参考手册略微倾斜地指出,值是每种类型为自己定义的概念(强调添加):

  

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

换句话说,没有关于什么"值"的一般概念。是。每种类型都为自己定义了什么"值"表示该类型的对象。通常,"值"的概念与平等的概念有关;对象被认为具有相同的值"如果比较相等。因此,类型可以通过定义__eq__方法来指定其值的概念。

所以,回答你关于类的具体问题:从这个意义上说,类对象的价值就在于它本身,因为类对象是通过对象标识进行比较的,并且没有两个类对象是相等的。

答案 3 :(得分:0)

我认为只有当我们能够将它与另一个对象进行比较时, value 的概念才有意义。官方Python 3 documentation

支持此声明
  

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

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

>>> 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()函数的不同调用的静态对象不比较相等,因此假定它们具有不相等的值仅仅因为它们具有不同的身份。