首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中,类和字典之间有什么区别(除了几个列出的例外)?

在Python中,类和字典之间有什么区别(除了几个列出的例外)?
EN

Software Engineering用户
提问于 2014-11-10 21:13:58
回答 2查看 2.2K关注 0票数 5

我的逻辑是这样的:

代码语言:javascript
运行
复制
def A(val):
    return {'a':val}

print(A(7)['a'])

是相同的

代码语言:javascript
运行
复制
class A:
    def __init__(self, val):
        self.a = val

print(A(7).a)

很明显,这里有一些问题和不同之处:

  • 这只适用于像python这样的语言,您可以在其中创建一个具有不同类型的字典。
  • 创建“对象”的语法。这就是为什么(我认为)类更优秀的原因,因为使用函数创建类很快就会变得非常烦人。
  • 特殊的捷径治疗。与str(x)调用一样,__str__和obj.function()将更改为cls.function(obj)。
  • 遗产继承。
  • 实际的类对象(如果A是类,则可以获得A.__init__ (例如)作为一个未绑定的方法。

除了这些小例子,字典==类(对我来说)。你同意我的观点吗?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2014-11-10 21:34:28

可以将对象o视为包含以下内容的实体

  1. 一个局部变量v1,v2,.(对象的状态),
  2. 一组闭包m1,m2,.在v1、v2、m1、m2 (对象的方法)上关闭,
  3. 一种通过名称访问局部变量和方法的机制:对象基本上是一个高阶函数,它以名称作为输入,并因此返回字段或方法。

在Python对象中,使用点表示法(o.var,o.foo())访问成员和方法。当然,您可以像前面描述的那样,通过字典来轻松地模拟:字典也是映射(参见第3点),您可以使用它来存储对象字段或方法。

因此,我要说的是,类构造是表示对象模式的一种更方便的语法。您也可以用字典模拟对象,它只会变得更详细。

创建“对象”的语法。这就是为什么(我认为)类更优秀的原因,因为使用函数创建类很快就会变得非常烦人。

与创建类的函数不同,我可以想象使用函数来创建对象(即特殊字典),这些对象对应于类构造函数。还请参阅您的示例:函数A()是对应于类A__init__()方法的构造函数。

遗产继承。

我认为,如果使用返回字典的构造函数对类建模,那么可以在子类构造函数中使用超类构造函数来建模继承。子类构造函数可以调用超类构造函数,然后用自己的定义扩展/重写生成的字典。

例如:

代码语言:javascript
运行
复制
# Superclass A.
def A(val):
    def toString(a):
        return str(a['a'])

    def printOut(a):
        print(a['toString'](a))

    return {'a': val, 'toString': toString, 'printOut': printOut}

# B is a subclass of A.
def B(val):
    # Override method.
    def toString(a):
        return 'value = ' + str(a['a'])

    r = A(val)
    r['toString'] = toString
    return r

总之,我不认为字典和课堂是一样的:

  • 字典是一种任意映射。
  • 对象是从名称到变量和方法的特殊映射。
  • 类是一种语言构造,它将具有类似结构的对象集合在一起,并帮助创建对象。
  • 可以直接使用函数和字典来模拟对象和类。
票数 2
EN

Software Engineering用户

发布于 2014-11-10 22:27:22

你是对的。动态语言中的对象是从高级字典/映射对象演化而来的,在某些方面类似于这些对象。这对于基于原型的语言(如JavaScript )来说是非常正确的,对于基于类的语言(如Python和Ruby )也是如此。

然而,这个问题过于简单化。你问“有什么不同吗?”但很快就排除了不少非常重要的差异。像继承这样的功能(Python有一个精心设计的多继承系统,并提供广泛的元类支持)和dunder方法的特殊处理都不是小事。它们是定义语言的语义、操作和可扩展性的大量工作。

您可能希望列出Python类不同的其他方式,例如

  1. 在对象创建时进行干预,并系统地重新编排如何创建对象(元类),
  2. 使用静态、非字典表示(插槽),
  3. 通过属性表示法(obj.attr)访问成员
  4. 将函数属性(又名方法)专门化为虚拟属性(@property)、类而不是实例方法(@classmethod)或类相对正常函数(@staticmethod)。

我们可以在字典上列出更多类不同于单纯的“语法糖”的方法。而选择使用开槽的、非字典的实现应该能达成协议。但是,这样的上市错过了第一个问题:

类定义新的数据类型.

类和对象可能在某种程度上只是幻想的字典,但它们的进化程度已经足够,它们完全变成了其他的东西。

类定义新的数据类型。在该语言的所有最新版本中-2.x前进,使用子类object的“新样式对象”-用户定义的类在很大程度上也是等价的,并且与内置数据类型完全并行。您可以询问type(x)instance(x, (int, str, MyClass)),与类和实例交互,就像使用内置数据类型及其值一样。这在大多数传统的静态语言中是不可能的,在这种语言中,您可能可以构建新的抽象数据类型,但它们永远无法与内置类型相媲美或具有灵活性。

完全暴露:还有一些剩余的差异,很大程度上是微妙的,主要是基于这样一个事实,即内置类型是在C中“在幕后”实现的,而不是Python对象。就本身而言。

但是,在很大程度上,类与字典的不同之处在于,它们贯穿于语言设计之中,并使它们及其实例与语言定义类型相提并论。在Python中,它们与映射对象的相似性显然是次要的。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/262366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档